最近要给discuz论坛升级, 数据库是mysql4.0,mysql4.0以前的低版本不支持编码,数据都是Latin1编码的。新版论坛计划采用mysql5.1,gbk编码。
因为mysql版本相差太大,直接复制数据库文件的方法肯定不行,只能采用mysqldump。
步骤:
1. 将mysql4.0中数据导出成sql文件
mysqldump –skip-extended-insert –default-character-set=latin1 dbname -q -uroot -ppassword > dbname.sql
加 –skip-extended-insert参数是为了将每条记录写成独立的insert into,以降低可能存在的导入时sql出错造成的损失
2. 在 dbname.sql 最前面加一句 set names gbk
如果文件较小,直接vi dbname.sql后加;如果文件太大,可以 先建一个文件names.txt,里面写set names gbk; 然后用
cat names.txt dbname.sql > dbname_gbk.sql
3. 将sql文件导入到mysql5中:
mysql -uroot -ppassword -f dbname < dbname.sql
低版本中个别乱码造成可能造成sql报错而中断,加 -f 参数意思是如果出错,继续。 因为前面已经采用一条记录一个独立sql的方式,就算出错偶尔也就丢几条记录。
测试成功,一百万记录,中间就丢了2条。能接受。
下载了一个mysql手册中文翻译CHM版本,一直用。按中文手册对binlog-ignore-db的解释发现了一个错误。 中文手册对binlog-ignore-db的解释如下:
–binlog-ignore-db=db_name
告诉主服务器,如果当前的数据库(即USE选定的数据库)是db_name,不应将更新保存到二进制日志中。如果你使用该选项,你应确保只对当前的数据库进行更新。
一个不能按照你期望的执行的例子:如果服务器用binlog-ignore-db=sales启动,并且执行USE prices; UPDATE sales.january SET amount=amount+1000;,该语句不写入二进制日志。
而英文手册的解释是:
An example of what does not work as you might expect: If the server is started with
binlog-ignore-db=sales, and you runUSE prices; UPDATE sales.january SET amount = amount + 1000;, this statement is written into the binary log.
中文手册说不写入日志,我说怎么按中文手册的说法测试了几次都还是写入了。本来以为是我mysql版本的问题。还好我查了下英文版本的手册。翻译人员够粗心的,意思都翻译反了。看来关键性描述的还是得看英文原版手册。