正在加载......
类别:[MySQL学习]  时间: 2008-12-10 12:24:26; 浏览: 19254; 评论: 1  
Tags : 外键

      首先,目前MySQL的外键约束只适用于InnoDB数据表。

      创建外键约束时,如果把握不好,将无法创建,比如提示你:

以下是引用片段:

ERROR 1005 (HY000): Can't create table './dbname/tablename.frm' (errno: 150)

      为了查看更详细的信息,mysql提供了一个命令:

以下是引用片段:

show innodb status;

或者:

show engine innodb status;

      其中有一项“LATEST FOREIGN KEY ERROR”显示了最近的一次外键约束出错的详细信息,如:

以下是引用片段:

LATEST FOREIGN KEY ERROR
------------------------
081210 11:57:40 Error in foreign key constraint of table dbname/tablename:
foreign key (`gid`, `uid`) references `table2`(`gid`, `uid`)
) ENGINE = InnoDB:
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html
for correct foreign key definition.

     提问:不知道mysql其它的错误,有没有方法得到这样的提示?

也许您对下面的文章感兴趣:
    很抱歉暂时没有!
类别:[随便说说]  时间: 2008-12-02 12:52:47; 浏览: 84877; 评论: 0  

      今天去注册一个网易的邮箱,可能对方出现网络繁忙或其他原因,一直就停在注册页面,IE的进度条一直停滞不前,于是又点提交了一下,结果提示email被占用了。

      想必是我的注册名已经进入了对方的数据库,但一直没返回给前端页面信息。于是转而直接登录,或许帐号信息初始化工作未完成,便提示我是选择激活3G容量邮箱或注册另一个邮箱。当然,我选择了激活,为了不给对方有垃圾数据的机会嘛。

      经过漫长的页面加载,雷人的页面出现了,偶看见了前无古人的超长验证码:

    偶一看,彻底无语了,即使是机器人恶意注册,也不能这么难为机器人啊...... 如此超长的验证码,让我连续输入了好几遍都没有成功。

    验证码,对于技术人员而言是面对恶意攻击一个无奈的选择,因为它毕竟带来了低效的用户体验。网易邮箱做出了如此雷人、牛逼的选择,想必是无可奈何到了无以复加的地步了吧:)

也许您对下面的文章感兴趣:
  1. [2010-05-06 23:35:58] 验证码的使用场景小议
类别:[Linux/Unix]  时间: 2008-11-28 22:30:26; 浏览: 73347; 评论: 0  

    黑客是个令人向往、有前途的职业。我欣赏好黑客,讨厌坏黑客。所谓坏黑客,就是导致对方有人要加班的那种家伙。

    SYN Flood攻击是一种典型的拒绝服务型(Denial of Service)攻击。所谓拒绝服务型攻击就是通过进行攻击,使受害主机或网络不能够良好的提供服务,从而间接达到攻击的目的。黑客喜欢玩这个,以让对方加班而显示自己有水平、有能力、有魄力,其实呢,啥都不是。

    一:什么是SYN Flood攻击

    SYN Flood攻击利用的是IPv4中TCP协议的三次握手(Three-Way Handshake)过程进行的攻击。这个协议规定,如果一端想向另一端发起TCP连接,它需要首先发送TCP SYN (synchronize)包到对方,对方收到后发送一个TCP SYN+ACK包回来,发起方再发送TCP ACK (ACKnowledge Character)包回去,这样三次握手就结束了。

    在上述过程中,还有一些重要的概念:

    未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。或者说TCP服务器收到TCP SYN request包时,在发送TCP SYN+ACK包回TCP客户机前,TCP服务器要先分配好一个数据区专门服务于这个即把形成的TCP连接。一般把收到SYN包而还未收到ACK包时的连接状态成为半开连接(Half-open Connection)。

    Backlog参数:表示未连接队列的最大容纳数目。

    SYN-ACK 重传次数:服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。

    半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。

    在最常见的SYN Flood攻击中,攻击者在短时间内发送大量的TCP SYN包给受害者,这时攻击者是TCP客户机,受害者是TCP服务器。根据上面的描述,受害者会为每个TCP SYN包分配一个特定的数据区,只要这些SYN包具有不同的源地址(这一点对于攻击者来说是很容易伪造的)。这把给TCP服务器系统造成很大的系统负担,最终导致系统不能正常工作。

    二:SYN Cookie原理

    能够有效防范SYN Flood攻击的手段之一,就是SYN Cookie。SYN Cookie原理由D. J. Bernstain和 Eric Schenk发明。

    SYN Cookie是对TCP服务器端的三次握手协议作一些修改,专门用来防范SYN Flood攻击的一种手段。它的原理是,在TCP服务器收到TCP SYN包并返回TCP SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到TCP ACK包时,TCP服务器在根据那个cookie值检查这个TCP ACK包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。

    下面分Linux和FreeBSD来说说如何配置内核参数来实现SYN Cookie

    三:Linux下设置

    如果你的服务器配置不太好,TCP TIME_WAIT套接字数量达到两、三万,服务器很容易被拖死。通过修改Linux内核参数,可以减少服务器的TIME_WAIT套接字数量。

    TIME_WAIT可以通过以下命令查看:

以下是代码片段:
netstat -an | grep "TIME_WAIT" | wc -l

    在Linux下,如CentOS,可以通过修改/etc/sysctl.conf文件来达到目的。

    增加以下几行:

以下是代码片段:
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024    65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2


     说明:

  net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies,这是个BOOLEAN。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
  net.ipv4.tcp_tw_reuse = 1 表示开启重用,这是个BOOLEAN。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
  net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,这是个BOOLEAN,默认为0,表示关闭。
  net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。单位为秒。
  net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。单位为秒。
  net.ipv4.ip_local_port_range = 1024    65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
  net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
  net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。
  net.ipv4.tcp_synack_retries和net.ipv4.tcp_syn_retries是定义SYN重试次数。

  执行以下命令使配置生效:

以下是代码片段:
 /sbin/sysctl -p

    如果你不想修改/etc/sysctl.conf,你也可以直接使用命令修改:

以下是代码片段:
/sbin/sysctl -w key=value

    四:FreeBSD下设置

    yayu个人学习的观点:FreeBSD中对syn的防御和Linux下可能不一样,配置的参数也不完全相同,相关配置和理解可能不对:)

    TCP链接中有一个MSL(max segment lifetime)的概念,也就是最大生成时间,MSL的值在一般的实现中取30s,有些实现采用2分钟。在TCP的状态机中的“被动关闭”:从CLOSE_WAIT到LAST_ACK中有一个如下的规则:当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL。这样可让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的 FIN)。

    存在这个规则导致一个后果就是在这个2*MSL的时间内,该地址上的链接(客户端地址、端口和服务器端的地址、端口)不能被使用。比如我们在建立一个链接后关闭链接然后迅速重启链接,那么就会出现端口不可用的情况。 

    TIME_WAIT时间是2*MSL。因此可以通过调整net.inet.tcp.msl来减少TIME_WAIT时间。对于Web服务器完全可以将这个值调整为7500或2000(访问一个web,超过4~15秒页面还刷不出来,就可以考虑放弃了-_-)

    参数设置参考:

以下是引用片段:

net.inet.tcp.syncookies=1
防止DOS攻击

net.inet.tcp.msl=7500
防止DOS攻击,默认为30000

net.inet.tcp.blackhole=2
接收到一个已经关闭的端口发来的所有包,直接drop,如果设置为1则是只针对TCP包

net.inet.udp.blackhole=1
接收到一个已经关闭的端口发来的所有UDP包直接drop

    FreeBSD下,yayu没看见“/sbin/sysctl -p”这样的命令可以使/etc/sysctl.conf的内容生效,所以直接使用命令了:

以下是代码片段:
sysctl net.inet.tcp.syncookies=1 net.inet.tcp.msl=7500 net.inet.tcp.blackhole=2 net.inet.udp.blackhole=1

    五:其他

    除了修改服务器的内核参数,还可以修改apache的配置文件中的Timeout、KeepAlive、MaxClients等参数来防止Dos攻击,如果有接口调用,还要注意控制一下调用的时间。请听下文分解。

    六:总结

    我讨厌让人加班的坏黑客,不过这也促进了我的学习。

    如果哪位看见上面有不对的地方,还请留意告知,谢谢!

    七:参考文章:

以下是引用片段:

SYN Cookie原理及在Linux内核中的实现
http://www.linux-cn.com/html/linux/kernel/20070411/1630.html

减少Linux下Squid服务器的TIME_WAIT套接字数量
http://blog.s135.com/post/338.htm

TCP协议三次握手
http://www.blogjava.net/hallywang/archive/2007/03/12/103327.html

Tcp三次握手与四次挥手
http://skyyue.bokee.com/viewdiary.15883132.html

linux服务器历险之sysctl优化linux网络
http://blog.csdn.net/chinalinuxzend/archive/2007/09/20/1792184.aspx

中国最完整的sysctl.conf优化方案
http://www.bsdlover.cn/html/38/n-138.html

Linux 反 DDOS的几个设置
http://www.pgsqldb.org/mwiki/index.php/Linux_%E5%8F%8D_DDOS%E7%9A%84%E5%87%A0%E4%B8%AA%E8%AE%BE%E7%BD%AE

FreeBSD系统优化部分内核参数调整中文注释
http://fanqiang.chinaunix.net/system/bsd/2005-04-06/3101.shtml

linux系统优化sysctl
http://bbs.linuxsky.org/thread-7161-1-1.html

SYN,ACK的英文全拼是什么?
http://ks.cn.yahoo.com/question/1407072302504.html

也许您对下面的文章感兴趣:
  1. [2008-01-16 15:31:20] linux和freebsd下的路由操作的区别
  2. [2008-04-15 18:18:19] [翻译]What is Linux? -- 什么是Linux
  3. [2008-04-03 15:35:46] [翻译]What is Linux? -- Linux从这里开始
  4. [2008-03-29 22:56:08] uniq和sort对汉字的识别差异
  5. [2008-01-24 18:53:26] eAccelerator 0.9.5.2 安装
  6. [2008-01-23 10:35:20] cut命令学习
  7. [2008-01-16 15:31:20] linux和freebsd下的路由操作的区别
  8. [2008-01-15 18:49:54] 修改符号链接的属主的方法
  9. [2007-12-21 19:31:50] libeven、memcached、libmemcache安装
  10. [2007-12-04 17:58:27] memcached英文文档学习
  11. [2007-12-05 19:57:35] cgi的写法
  12. [2007-11-06 11:02:43] PHP加速器eAccelerator文档翻译
  13. [2008-07-09 13:21:34] crontab命令的使用介绍及我的体会
  14. [2008-08-06 23:22:38] 让你的vim显示颜色
  15. [2009-02-16 19:40:04] Linux进程的层次关系
类别:[随便说说]  时间: 2008-11-19 19:18:05; 浏览: 92684; 评论: 3  
Tags : 生活
类别:[随便说说]  时间: 2008-10-23 23:28:51; 浏览: 20765; 评论: 0  
Tags : 工作 职业
类别:[随便说说]  时间: 2008-10-22 16:07:59; 浏览: 30910; 评论: 0  
类别:[Linux/Unix]  时间: 2008-10-14 22:37:13; 浏览: 51361; 评论: 0  
Tags : man 命令
类别:[MySQL学习]  时间: 2008-10-09 12:15:03; 浏览: 43544; 评论: 0  
类别:[随便说说]  时间: 2008-09-26 17:36:34; 浏览: 57837; 评论: 0  
类别:[随便说说]  时间: 2008-09-25 10:50:03; 浏览: 10267; 评论: 0  
Tags : 汉奸
[196][5/20][1][2][3][4][5][6][7][8][9][10][>|] | 回页首
© 2004 - 2018 芽雨快跑 - 本页面所有内容,未经芽雨许可,欢迎转载,请注明出处

京ICP备09017802号