国内开源软件下载点
开源软件在国内也是越来越来的支持下载了,国内的两大网站已经开始提供了一些软件的下载:
感谢两个公司对国内开源的支持。
希望下一步有一个Perl的cpan的镜象。
开源软件在国内也是越来越来的支持下载了,国内的两大网站已经开始提供了一些软件的下载:
感谢两个公司对国内开源的支持。
希望下一步有一个Perl的cpan的镜象。
作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式:select unhex(’777562696E67786940676D61696C2E636F6D’); 载请注明作/译者和出处,并且不能用于商业用途,违者必究。
在使用Innodb引擎时将要面对两种表空间的管理选择的问题,Innodb有两种管理表空间的方法:
1. 共享表空间(也可以拆分成多个小的表空间)
2. 独立表空间每一个表有一个独立的表空间。
我个人推荐使用独立表空间。在性能和运维上独立表空间比共享的表空间有很多优势。下面我将分别说明一下两种表空间管理的特点。
共享表空间:
优点:
可以放表空间分成多个文件存放到各个磁盘上(表空间文件大小不受表大小的限制,如一个表可以分布在不同步的文件上)。数据和文件放在一起方便管理。
缺点:
所有的数据和索引存放到一个文件中以为着将有一个很常大的文件,虽然可以把一个大文件分成多个小文件,但是多个表及索引在表空间中混合存储,这样对于一个表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析,日值系统这类应用最不适合用共享表空间。
我们知道共享表空间管理会出现表空间分配后不能回缩的问题,当出现临时建索引或是创建一个临时表的操作表空间扩大后,就是删除相关的表也没办法回缩那部分空间了。我们存在磁盘监控时,也许就报警不断了,但实际上MySQL还可以运行良好。另外,当磁盘上占用较多时性能也不是太好。
这种情况处理只能是是建一个新的Slave从主库上Dump出来,然后在Dump到从库中,动作较大。
对于InnoDB Hot Backup备份的操作(或是直接冷备),每次需要CP的文件比较大。如果现在有180G的表空间,但实际数据只有50多G,那么我们将面对每次需要拷180G的数据。
这种方式也许mysqldump是一个好的处理方式了。
独立表空间:
在配置文件(my.cnf)中设置: innodb_file_per_table
优点:
1. 每个表都有自已独立的表空间。
2. 每个表的数据和索引都会存在自已的表空间中。
3. 可以实现单表在不同的数据库中移动。
4. 空间可以回收(除drop table操作处,表空不能自已回收)
a) Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过:alter table TableName engine=innodb;回缩不用的空间。
b) 对于使innodb-plugin的Innodb使用turncate table也会使空间收缩。
c) 对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。
缺点:
单表增加过大,如超过100个G。
对于单表增长过大的问题,如果使用共享表空间可以把文件分开,但有同样有一个问题,如果访问的范围过大同样会访问多个文件,一样会比较慢。对于独立表空间也有一个解决办法是:使用分区表,也可以把那个大的表空间移动到别的空间上然后做一个连接。其实从性能上出发,当一个表超过100个G有可能响应也是较慢了,对于独立表空间还容易发现问题早做处理。
备份:
InnoDB Hot Backup(冷备)的表空间cp不会面对很多无用的copy了。而且利用innodb hot backup及表空间的管理命令可以实现单现移动。
监控:
可以更好从系统上监控数据的大小,每个表的大小。
另外推荐使用独立表空间的原因:
从性能上对比共享表空间和独立表空间:
共享表空间在Insert操作上少有优势。其它都没独立表空间表现好。这里也有一个TIPS当启用独立表空间时,请合理调整一下:innodb_open_files 。
从Linux系统处理上出发:
文件系统fsync一大片更新数据,对系统io冲击较大。若分隔成多个小数据fsync,能够减少对读的影响。 同时从mysql代码,发现mysql保证两次fsync之间至少有20ms的sleep,这样的话,若将一次fsync变成多次小数据操作,应该能够减少慢查询的比例。所以对于大量更新操作的系统不太适合用共享表空间。
作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式:select unhex(’777562696E67786940676D61696C2E636F6D’); 载请注明作/译者和出处,并且不能用于商业用途,违者必究。
为什么需要在Windows下编译MySQL?
在Linux下编译MySQL是非常方便的操作,而且是轻车熟路,很容易搞定的。随着对MySQL的使用时间的增长,也慢慢的对MySQL代码的分析有点感兴趣了。所以想着找一个工具去学习一下MySQL的代码,对于Linux用户可以使用vim+ctags去分析,
但做为大多数用户来说工作的平台还都是windows平台。所以就需要在windows上去调试MySQL了。
对于下载的MySQL在Windows平台上无法直接编译的,工程文件没了,这里关建问题就是怎么创建一个工程文件。下面我装分几步去讲解,怎么去创建工程文件,怎么调试,怎么编译。
准备工作:
安装一个编译器,推荐Microsoft visual studio 2008吧
另外需要装:
GNU Bison for Windows :http://gnuwin32.sourceforge.net/packages/bison.htm
CMake 2.6.0 or later : http://www.cmake.org
开始编译:
这里以mysql-5.1.38的源码编译为例:
mysql-5.1.38的代码下载可以到mysql官方网站下载,具体怎么下载不在说明。
打开一个cmd窗口:
输入:
cscript //H:CScript
然后:
cd /path/mysql-5.1.38
win\configure WITH_INNOBASE_STORAGE_ENGINE __NT__
win\build-vs9.bat
到此我们将会创建一个mysql.sln 的工程文件,如果对想学习代码的朋友,到此即可以,然后可以用Microsoft visual studio 2008打开这个文件就可以查看相应的代码了。
如果需要调试或单步执行调试:
这里以mysqld项目为例:
打开项目 mysqld 的属性 点击 debugging
在mysqld的属性页设置命令参数(Command Arguments)为:–console。这样就可以用debug方式调试代码了。
同样对于其它项目的调试,也是这样处理,属性,添加命令行参数:–console。
对于想跟踪的项目可以执行build,然后可以在mysql-5.1.38/client/Debug下生成相应的执行文件。
如果真的想编译一个Windows的MySQL,上面那个打开步骤可以不做。接着上面完成的bat后,直接进行:
vcbuild mysql.sln “Release”
进行编译。然后拷mysqld.exe及相应的文件到相应的目录就OK了。具体怎么安装,这里也不在说明了。本文档的核心目的就是教会大家怎么创建工程文件,然后怎么去调试。
作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式:select unhex(’777562696E67786940676D61696C2E636F6D’); 载请注明作/译者和出处,并且不能用于商业用途,违者必究。
用Drupal太灵活了,灵活的我都搞不定了。所以我投向了worldpress.对比了一下表结构。参考网上的说明搞出了:
use support;
delete from wp_posts;
delete from wp_comments;
# posts
INSERT INTO
wp_posts (id, post_date, post_content, post_title,
post_excerpt, post_name, post_modified)
SELECT DISTINCT
n.nid, FROM_UNIXTIME(created), body, n.title,
teaser,
REPLACE(REPLACE(REPLACE(REPLACE(LOWER(n.title),’ ‘, ‘_’),’.', ‘_’),’,', ‘_’),’+', ‘_’),
FROM_UNIXTIME(changed)
FROM drupal_bak.node n, drupal_bak.node_revisions r
WHERE n.vid = r.vid;
# comments
INSERT INTO
wp_comments
(comment_post_ID, comment_date, comment_content, comment_parent, comment_author, comment_author_email, comment_author_url)
SELECT
nid, FROM_UNIXTIME(timestamp),
comment, thread, name, mail, homepage
FROM drupal_bak.comments ;
# update comments count on wp_posts table
UPDATE `wp_posts` SET `comment_count` = (SELECT COUNT(`comment_post_id`) FROM `wp_comments` WHERE `wp_posts`.`id` = `wp_comments`.`comment_post_id`);
# fix post slugs. first we have to remove the duplicate _____ chars, then replace that with a single – char
UPDATE wp_posts set post_name = REPLACE(post_name, ‘__’, ‘_’);
UPDATE wp_posts set post_name = REPLACE(post_name, ‘__’, ‘_’);
UPDATE wp_posts set post_name = REPLACE(post_name, ‘__’, ‘_’);
UPDATE wp_posts set post_name = REPLACE(post_name, ‘__’, ‘_’);
UPDATE wp_posts set post_name = REPLACE(post_name, ‘_’, ‘-’);
然后就可以看到worldpress工作了。
作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式:select unhex(’777562696E67786940676D61696C2E636F6D’); 载请注明作/译者和出处,并且不能用于商业用途,违者必究。
从服务器show slave status\G;状态正常,show processlist;这个时候我观察到一个复制线程的Time值为4294967295,这个数字为2^32-1,数据比较特殊,然后我再show processlist;Time成为0,再查看,Time值变为1,等会再查看的时候Time值又变为4294967295,反正TIME值就是在 4294967295,0,1之间变化,show slave status\G,从服务器正常在运作。
mysql> show processlist;
+——-+————-+———–+——+———+————+———————————————————————–+——————+
| Id | User | Host | db | Command | Time | State | Info |
+——-+————-+———–+——+———+————+———————————————————————–+——————+
| 4 | system user | | NULL | Connect | 2950273 | Waiting for master to send event | NULL |
| 5 | system user | | NULL | Connect | 4294967295 | Has read all relay log; waiting for the slave I/O thread to update it | NULL |
| 14814 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+——-+————-+———–+——+———+————+——————————————————————
mysql> show processlist;
+——-+————-+———–+——+———+———+———————————————————————–+——————+
| Id | User | Host | db | Command | Time | State | Info |
+——-+————-+———–+——+———+———+———————————————————————–+——————+
| 4 | system user | | NULL | Connect | 2950543 | Waiting for master to send event | NULL |
| 5 | system user | | NULL | Connect | 0 | Has read all relay log; waiting for the slave I/O thread to update it | NULL |
| 14814 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+——-+————-+———–+——+———+———+———————————————————————-
mysql> show processlist;
+——-+————-+———–+——+———+———+———————————————————————–+——————+
| Id | User | Host | db | Command | Time | State | Info |
+——-+————-+———–+——+———+———+———————————————————————–+——————+
| 4 | system user | | NULL | Connect | 2950574 | Waiting for master to send event | NULL |
| 5 | system user | | NULL | Connect | 1 | Has read all relay log; waiting for the slave I/O thread to update it | NULL |
| 14814 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+——-+————-+———–+——+———+———+———————————————————————-
这个时间表示:
Slave的SQL线程连接上Master的时间点和实际进行的SQL点的时间差别。例,当Slave和Master断开时间为30分钟,再时连上,这个时间为1800。
另一方面网络不稳也会出现问题。
遇到攻击。
采取措施:
做了DNS负载均衡,一个域名指向多台机器(负载均衡器的Session已经经分配较慢)
加入:
net.ipv4.tcp_synack_retries=3
net.ipv4.tcp_syn_retries=3
net.ipv4.tcp_max_syn_backlog=2048
net.ipv4.tcp_syncookies=1
封超过100个连接的IP:
#!/bin/sh
/bin/netstat -na|grep ESTABLISHED|awk ‘{print $5}’|awk -F: ‘{print $1}’|sort|uniq -c|sort -rn|grep -v -E ’172.16|127.0′|awk ‘{if ($2!=null && $1>100) {print $2}}’>/tmp/dropip
for i in $(cat /tmp/dropip)
do
/sbin/iptables -I INPUT -p tcp -m tcp -s $i –dport 80 –syn -j REJECT
echo “$i kill at `date`”>>~river/ddos
done
最终效果还是不明显,IP变化太大。
今天继续找找别的方法。
#!/bin/bash
tcpdump -i eth0 -s 0 -l -w – dst port 3306 | strings | perl -e ‘
#!/bin/bash
while(<>) { chomp; next if /^[^ ]+[ ]*$/;
if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|CALL)/i) {
if (defined $q) { print “$q\n”; }
$q=$_;
} else {
$_ =~ s/^[ \t]+//; $q.=” $_”;
}
}’
转:http://blog.csdn.net/c_sharp_Rookie/archive/2009/01/15/3786317.aspx
在目前的企业信息系统中,数据库还是最佳的数据存储方式,虽然已经有很多的书籍在指导我们进行数据库设计,但应该那种方式是设计数据库的表结构的最好方 法、设计时应遵从什么样的原则、四个范式如何能够用一种方式达到顺畅的应用等是我一直在思考和总结的问题,下文是我针对这几个问题根据自己的设计经历准备 总结的一篇文章的提纲,欢迎大家一块进行探讨,集思广益。其中提到了领域建模的概念,但未作详细解释,希望以后能够有时间我们针对这个命题进行深入探讨。
1) 不应该针对整个系统进行数据库设计,而应该根据系统架构中的组件划分,针对每个组件所处理的业务进行组件单元的数据库设计;不同组件间所对应的数据库表之 间的关联应尽可能减少,如果不同组件间的表需要外键关联也尽量不要创建外键关联,而只是记录关联表的一个主键,确保组件对应的表之间的独立性,为系统或表 结构的重构提供可能性。
2)采用领域模型驱动的方式和自顶向下的思路进行数据库设计,首先分析系统业务,根据职责定义对象。对象要符合封 装的特性,确保与职责相关的数据项被定义在一个对象之内,这些数据项能够完整描述该职责,不会出现职责描述缺失。并且一个对象有且只有一项职责,如果一个 对象要负责两个或两个以上的职责,应进行分拆。
3)根据建立的领域模型进行数据库表的映射,此时应参考数据库设计第二范式:一个表中的所 有非关键字属性都依赖于整个关键字。关键字可以是一个属性,也可以是多个属性的集合,不论那种方式,都应确保关键字能够保证唯一性。在确定关键字时,应保 证关键字不会参与业务且不会出现更新异常,这时,最优解决方案为采用一个自增数值型属性或一个随机字符串作为表的关键字。
4)由于第一点所述的领域模型驱动的方式设计数据库表结构,领域模型中的每一个对象只有一项职责,所以对象中的数据项不存在传递依赖,所以,这种思路的数据库表结构设计从一开始即满足第三范式:一个表应满足第二范式,且属性间不存在传递依赖。
5)同样,由于对象职责的单一性以及对象之间的关系反映的是业务逻辑之间的关系,所以在领域模型中的对象存在主对象和从对象之分,从对象是从1-N或N-N的角度进一步主对象的业务逻辑,所以从对象及对象关系映射为的表及表关联关系不存在删除和插入异常。
6) 在映射后得出的数据库表结构中,应再根据第四范式进行进一步修改,确保不存在多值依赖。这时,应根据反向工程的思路反馈给领域模型。如果表结构中存在多值 依赖,则证明领域模型中的对象具有至少两个以上的职责,应根据第一条进行设计修正。第四范式:一个表如果满足BCNF,不应存在多值依赖。
7) 在经过分析后确认所有的表都满足二、三、四范式的情况下,表和表之间的关联尽量采用弱关联以便于对表字段和表结构的调整和重构。并且,我认为数据库中的表 是用来持久化一个对象实例在特定时间及特定条件下的状态的,只是一个存储介质,所以,表和表之间也不应用强关联来表述业务(数据间的一致性),这一职责应 由系统的逻辑层来保证,这种方式也确保了系统对于不正确数据(脏数据)的兼容性。当然,从整个系统的角度来说我们还是要尽最大努力确保系统不会产生脏数 据,单从另一个角度来说,脏数据的产生在一定程度上也是不可避免的,我们也要保证系统对这种情况的容错性。这是一个折中的方案。
8)应针 对所有表的主键和外键建立索引,有针对性的(针对一些大数据量和常用检索方式)建立组合属性的索引,提高检索效率。虽然建立索引会消耗部分系统资源,但比 较起在检索时搜索整张表中的数据尤其时表中的数据量较大时所带来的性能影响,以及无索引时的排序操作所带来的性能影响,这种方式仍然是值得提倡的。
9) 尽量少采用存储过程,目前已经有很多技术可以替代存储过程的功能如“对象/关系映射”等,将数据一致性的保证放在数据库中,无论对于版本控制、开发和部 署、以及数据库的迁移都会带来很大的影响。但不可否认,存储过程具有性能上的优势,所以,当系统可使用的硬件不会得到提升而性能又是非常重要的质量属性 时,可经过平衡考虑选用存储过程。
10)当处理表间的关联约束所付出的代价(常常是使用性上的代价)超过了保证不会出现修改、删除、更改 异常所付出的代价,并且数据冗余也不是主要的问题时,表设计可以不符合四个范式。四个范式确保了不会出现异常,但也可能由此导致过于纯洁的设计,使得表结 构难于使用,所以在设计时需要进行综合判断,但首先确保符合四个范式,然后再进行精化修正是刚刚进入数据库设计领域时可以采用的最好办法。
11)设计出的表要具有较好的使用性,主要体现在查询时是否需要关联多张表且还需使用复杂的SQL技巧。
12)设计出的表要尽可能减少数据冗余,确保数据的准确性,有效的控制冗余有助于提高数据库的性能。
==================================================
以前也总写一些这方面的总结,无耐没办法提升到理论层次。今天看到这个感觉很不错,所以就转过来了。对一个大系统设计往往需要拆分成不同的功能去实现,同样对于内部数据也尽量减少关连直接操作。可以用基于主建的Hash类数据结构来获得相应的数据。设计表结构中太多东西需要注意了,以上原则部分也是一个基础部分,需要记住的。
作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式:select unhex(’777562696E67786940676D61696C2E636F6D’); 载请注明作/译者和出处,并且不能用于商业用途,违者必究。
对于一个2000W的大表,一次走一个全表扫描确是很困难的。不过对于100W的表走一个全描扫也困难。
如果做这件事情又不想影响太大,就要分步来完成。
我给你一个思路你来参考一下。
首先衡量删除操作有多大。
selet count(*) from table1 a ,table2 b where a.pid=b.pid;
如果都有索引的话,这个操作还是挺快的。
如果操作的操作大于原表的40%,那么很有必要重建这个表了。
重建表的方法:就是按条件提取数据到一个新表,最后改名完成。这是一种方案。
另一种 删除方向。
上面通过比较觉的需要删除的量不是太大时,把需要删除的PID生到到另一个临时表中。
mysql DBname -e “select a.pid from table1 a ,table2 b where a.pid=b.pid”>del_pid.txt;
sed -i ’1d’ del_pid.txt
awk ‘{print “delete from table1 where pid=”,$1,”;”}’ del_pid.txt >del_pid.sql
mysql DBname<del_pid.sql
这样把SQL拆成多个SQL执行速度应该不会太慢了。
如果还是感觉不行,那就只能分段操作了。
今天上午去参加了Sun的CxO大会,本想得到一些Sun关于MySQL发展方向的消息,但并没得到确切的消息。MySQL的Richard Mason(Sun公司MySQL全球销售副总裁)只是透漏Oracle收购了Sun后MySQL也可能做为Oracle的一个产品去运营。
在大会上Richard更多的强调MySQL的策略就是攻占中端市场,网站市场。这点我是认同的。并切相信MySQL在这方面做的很棒。此次大会也可以说是Sun决心在中国建立一个好的销售渠道的一个表现。顺便支持一下Sun的行为。
希望MySQL发展的更好吧。也期待5.4的Release。
此次大会也一点稳人心的感觉。MySQL现在虽然属于Oracle了,大家不用担心他会被灭掉。MySQL还会永远的活下去。