博客首页|TW首页| 同事录|业界社区

屈伟

创业路上的程序猿

mysql

转换mysql低版本数据到mysql5

最近要给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条。能接受。

Tags: ,

星期五, 04月 10th, 2009 技术 2条评论

mysql手册中文翻译binlog-ignore-db的错误

下载了一个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 run USE prices; UPDATE sales.january SET amount = amount + 1000;, this statement is written into the binary log.

中文手册说不写入日志,我说怎么按中文手册的说法测试了几次都还是写入了。本来以为是我mysql版本的问题。还好我查了下英文版本的手册。翻译人员够粗心的,意思都翻译反了。看来关键性描述的还是得看英文原版手册。

Tags:

星期六, 03月 14th, 2009 技术 3条评论