上回在整理快速
升级方案的时候提到过,将转换程序中大数据量的步骤抽离出来用shell来跑.这次在大河网测试转换的时候做了下尝试.
假想一下,你的回复一张表大小达到了50G,用浏览器进行请求,转换数据跳转一步需要多长时间,有没有可能数据库还在读数据的时候,php就已经提示你的连接超时了呢?而且用shell跑会省了很多不必要的麻烦事,域名解析,超时。这些我们都不用考虑
那么现在说下这个方案是怎么实现的?
----------------------------------------------------
run with shell:
1. /home/wwwroot/pwb/shell/do_{$step}.sh
2. /home/wwwroot/pwb/pwbuilder_shell.php
3. /home/wwwroot/pwb/source/discuz60/do_shell.php
-----------------------------------------------------
run with http:
1. /home/wwwroot/pwb/pwbuilder.php
2. /home/wwwroot/pwb/source/discuz60/do.php
============================================================
更新纪要:
1). pwbuilder.php 不做修改
2). pwbuilder_shell.php 接收shell参数,调用do_shell.php
3). do.php中注释掉shell跑的那些步骤
4). do_shell.php 中注释调http跑的那些步骤,去掉步骤跳转代码
5). 各个step的shell脚本存放在/pwb/shell/do_{$step}.sh
============================================================
需要shell跑的数据(最好在mysql服务器上跑,php用绝对地址)
step = 4: 会员
step = 6: 主题
step = 12: 回复
step = 13: 附件
step = 15: 短消息
step = 18:标签
step = 22:评分数据
step = 23:根据评分信息来更新tmsgs的ifmark字段
step = 26: 分类信息数据
------------------------------------------------------------
跑数据流程参考:
1、1-3步 [http]
2、4步 【shell】可以同时跑下一步
3、5步跑完后 进行下一步 [http]
4、6、12、13、22步可以同时跑【shell】(独立)
4、6步跑完后, 开始7-11步(需要主题跑完) [http]
5、14步 [http]
6、15步,需要4步转换完成后进行 【shell】
7、16-17步:[http]
8、18步 【shell】(独立)
8、19-21 [http]
8、22步见上面 【shell】
9、23步,需要评分和主题跑完【shell】
10、24-25步 [http]
11、26步:需要25步跑完【shell】
这个主要流程是这样的,在
linux服务器上命令行下,执行
- /home/wwwroot/pwb/shell/do_{$step}.sh
文件,这些文件里边是这样的,比如会员的do_4.sh脚本代码如下:
- #!/bin/sh
- #增量开始uid
- START=0;
- #增量前开始uid
- #START=0;
- #cdb_members最大uid
- MAXuid=912586;
- #增量前最大uid
- #MAXuid=912586;
- #批量执行条数
- PERCOUNT=5000;
- #转换程序step值
- STEP=4;
- while [ $START -le $MAXuid ]
- do
- END=`expr $START + $PERCOUNT`;
- echo "起始uid:"$START" 截止uid:"$END" 当前时间: "`date +%Y-%m-%d/%H:%M:%S`;
- #执行转换程序
- /usr/local/php.5.3.3/bin/php -e /home/www/pwb/pwbuilder_shell.php build discuz60 $STEP $START $PERCOUNT
- START=$END;
- done
- echo "第4步 '用户' 数据转换完成,当前时间: "`date +%Y-%m-%d/%H:%M:%S`;
要修改的就是start maxid step 这三个参数,其他就只要在pwb根目录下建一个pwbuilder_shell.php文件用来接收shell的参数,调用和shell跑的定制的转换步骤,这个文件就在 /home/wwwroot/pwb/source/discuz60/do_shell.php里边,将do_shell.php里边的跳转全部去掉,shell提供step、start、percount三个参数,do_shell.php文件就接收这三个参数,查询数据库,执行结束进行下一个shell循环,知道shell循环结束,这里就是那个maxid起到的作用。
基本上就是通过这几个参数控制一下,其他小数据量的也可以独立出来只是没多少必要,在web下转换也是很快的。小站点也没必要用这个方案。
大河网bbs的数据库已经高达80G了。用这个方案 顺利的话 能在8-9个小时以内跑完。
如果有兴趣的同学可以研究一下,有哪里可以改进的 可以回复探讨一下,目前只整理了discuz6.0版本的方案!