Gentoo Logo

MySQL 4.*或5.0.*的升级指南

内容:

1.  直接升级,建议从4.1 => 5.0移动

4.1的myisam存储引擎已经足够成熟了,它允许直接升级到下一个MySQL的主版本。

注意: 对于MERGE表来说不是这样。如果你尝试直接升级这种很少用的表类型你可能会陷入麻烦。你应该清除并重建这些表,并且在升级过程中把他们的内容储存起来。如果你不太确定,你应该从Upgrading from old versions of MySQL 开始。

在这一步需要两个命令行,因为lock属于mysql会话。

代码 1.1: 直接从4.1升级至5.0.*

# quickpkg dev-db/mysql
# alias MYSQL="mysql --user=root --password='your_password'"
# DATADIR=$(MYSQL --batch --raw --silent --skip-column-names \
     --execute='SHOW variables LIKE "datadir";' \
     | sed -e 's|datadir[ \t]||')

(下一步应该在第二个命令行下做)
# mysql --user=root --password='your_password'
mysql> FLUSH TABLES WITH READ LOCK;

(回到第一个命令行来运行这个命令)
# tar -cjpvf ~/mysql.$(date +%F"T"%H-%M).tar.bz2 \
     /etc/conf.d/mysql /etc/mysql/my.cnf "${DATADIR}"

(接下来的命令应该在第二个命令行下做)
mysql> UNLOCK TABLES;
mysql> quit

(回到第一个命令行来完成接下来的升级)
# tar -tjvf ~/mysql.*.tar.bz2
# emerge -av ">dev-db/mysql-5.0"
# dispatch-conf
# revdep-rebuild
# /etc/init.d/mysql restart
# mysql_upgrade_shell --user=root --password='your_password' \
     --protocol=tcp --datadir="${DATADIR}"
# /etc/init.d/mysql restart
# unset DATADIR
# unalias MYSQL

2.  从旧的MySQL版本升级

用户从老的MySQL版本(<4.0.24)升级需要现安装MySQL 4.0.25。如果你已有一个更新的版本,你可以跳过这一区域,并从next one继续。

代码 2.1: 简单升级

# emerge -av --buildpkg "<mysql-4.1"

3.  为你当前的数据做备份

重要: 在不同的MySQl版本中主键的值的处理方式是不一样的,请参见bug #108502来得到更多信息,极其推荐你扫描“0”(zero)或更小的值,并且升级它们到一个大于等于“1”的值。

所有数据库管理员必须做的最重要的任务之一就是备份数据,那我们就开始吧:

代码 3.1: 所有数据库的dump

# mysqldump \
  -uroot \
  --password='your_password' \
  -hlocalhost \
  --all-databases \
  --opt \
  --allow-keywords \
  --flush-logs \
  --hex-blob \
  --master-data \
  --max_allowed_packet=16M \
  --quote-names \
  --result-file=BACKUP_MYSQL_4.0.SQL

现在一个叫做BACKUP_MYSQL_4.0.SQL的文件应该存在,它可以在后面你重建数据时起到作用。数据是被SQL的MySQL语言描述的,它是一种结构化查询语言。

现在是检查你的备份是否正常工作的好时间了。

4.  从最近的MySQL版本升级

如果你跳过了step #1,你现在必须创建一个最近安装的版本的备份包(是数据服务的,不是数据的):

代码 4.1: 二进制包备份

# quickpkg dev-db/mysql

现在是时间吧最近的版本和它所有的数据清理干净了:

代码 4.2: 卸载MySQL

# /etc/init.d/mysql stop
# emerge -C mysql
# tar cjpvf ~/mysql.$(date +%F"T"%H-%M).tar.bz2 /etc/mysql/my.cnf /var/lib/mysql/
# ls -l ~/mysql.*
# rm -rf /var/lib/mysql/ /var/log/mysql

注意: 现在两个不同的备份应该存在:SQL的一个,这个在不同版本间是轻便的,另一个允许你快速恢复你的数据库。更多的细节将会在后面提到。

当你摆脱了旧的MySQl安装后,你现在可以安装新的版本了。记住必须用revdep-rebuild来rebuild与MySQL有联系的包。

代码 4.3: 升级二进制包

# emerge -av ">mysql-4.1"
(你也可以用dispatch-conf来升级你的配置文件)
# etc-update
# revdep-rebuild

现在配置新安装的MySQl版本并重启实例:

代码 4.4: 配置MySQL4.1的基本安装

# emerge --config =mysql-4.1.<micro_version>
# /etc/init.d/mysql start

最后你可以导入在step #2所创建的备份。

重要: 默认的/etc/mysql/my.cnf文件默认设置了二进制的登陆(log-bin)。它会记录每一个对数据的修改操作。如果你运行一个非常大的数据库(大于等于1GB),它会创建极大的文件,并且迅速地用掉磁盘空间。如果你空间不够,禁用二进制登陆会是个好主意。

重要: 在MySQL4.1和之前的版本默认的编码是utf8。如果数据包含了non-ASCII编码,你可能想要保持数据库默认的编码设置,通过使用在/etc/mysql/my.cnf文件里的latin1替换所有的utf8的东西。在Charset conversion这一章可以找到更多的信息。

重要: 管理的mysql数据库包括用户名、密码之间的其它东西must被编码为utf8。

当一个未知的键被包含时,较老的mysqldump组件可能会使用错误的指令来导出表。为了解决这个问题,用一下声明来包住SQL:

代码 4.5: 修复foreign key checks

SET FOREIGN_KEY_CHECKS=0
SET FOREIGN_KEY_CHECKS=1

接下来,导入备份

代码 4.6: 导入MySQL备份

# cat BACKUP_MYSQL_4.0.SQL \
     | mysql \
     -uroot \
     --password='your_password' \
     -hlocalhost \
     --max_allowed_packet=16M

# mysql_fix_privilege_tables \
     --defaults-file=/etc/mysql/my.cnf \
     --user=root \
     --password='your_password'

如果你现在重启MySQL服务并且所有的事都按预料进行,你就有了一个完全运行的4.1.x的MySQL版本。

代码 4.7: 重启MySQL实例

# /etc/init.d/mysql restart

如果当你在升级时遇到任何问题,请把它们报告到Bugzilla

5.  恢复旧的MySQL 4.0安装

如果你不喜欢MySQL 4.1,你可以回到MySQL 4.0。

代码 5.1: 恢复到上一个版本

# /etc/init.d/mysql stop
# emerge -C mysql
# rm -rf /var/lib/mysql/ /var/log/mysql
# emerge --usepkgonly "<mysql-4.1"
(使用创建备份时的那个来代替 <timestamp>。)
# tar -xjpvf mysql.<timestamp>.tar.bz2 -C /
# /etc/init.d/mysql start

重要: 如果依据这个指南dev-db/mysql以外的包被编译安装了,你必须运行revdep-rebuild来确保每一个客户端使用了正确的mysql客户端共享组件。

6.  字符转换:

介绍

这一章并不打算成为一个如何做这样的转换的详尽的指南,反倒要成为一个读者可以推敲的短小的提示列表。

转换一个数据库可能是一个复杂的任务,并且难度随着数据的不同而增加。像serialized object和blobs是一个例子来说明把碎片弄在一起是很难的。

索引

每个utf-8字符连索引在内一共占3Byte。MySQL里的索引可以达到1000Byte那么长(767Byte是InnoDB表)。请记住限制使用Byte来衡量的,然而卷的长度是用字符的数量来解释的。

MySQL也可以在column的一部分创建索引,这可能有些帮助。下面是一些例子:

代码 6.1: 使用prefixes索引

$ mysql -uroot -p'your_password' test

mysql> SHOW variables LIKE "version" \G
*************************** 1. row ***************************
Variable_name: version
    Value: 5.0.24-log
1 row in set (0.00 sec)

mysql> CREATE TABLE t1 (
  ->   c1 varchar(255) NOT NULL default '',
  ->   c2 varchar(255) NOT NULL default ''
  ->   ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)

mysql> ALTER TABLE t1
  ->   ADD INDEX idx1 ( c1 , c2 );
ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes

mysql> ALTER TABLE t1
  ->   ADD INDEX idx1 ( c1(165) , c2(165) );
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> CREATE TABLE t2 (
  ->   c1 varchar(255) NOT NULL default '',
  ->   c2 varchar(255) NOT NULL default ''
  ->   ) ENGINE=MyISAM DEFAULT CHARSET=sjis;
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER TABLE t2
  ->   ADD INDEX idx1 ( c1(250) , c2(250) );
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> CREATE TABLE t3 (
  ->   c1 varchar(255) NOT NULL default '',
  ->   c2 varchar(255) NOT NULL default ''
  ->   ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER TABLE t3
  ->   ADD INDEX idx1 ( c1 , c2 );
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

环境

系统必须配置成支持UTF-8编码。你会在我们的Using UTF-8 with GentooLocalization Guide文档里发现更多信息。

在这个例子里,我们设置一些在/etc/env.d/02locale文件里的环境变量来利用英文的UTF-8编码:

代码 6.2: /etc/env.d/02locale

LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8

接下来请确定运行env-update && source /etc/profile

iconv

sys-libs/glibc提供的iconv是用来将文本文件从一个编码转换到另一个编码的工具。你也可以使用app-text/recode

代码 6.3: 使用iconv

(从latin1到utf8)
$ iconv -f ISO-8859-15 -t UTF-8 file1.sql > file2.sql

(从日语到utf8)
$ iconv -f ISO2022JP -t UTF-8 file1.sql > file2.sql

iconv可以在环境不是设置成utf8时记录一个sql的dump。

SQL矫正

你可以使用CONVERT()CAST()这两个MySQL函数来转换在你的SQL脚本中的数据。

Apache(web服务器)

为了apache使用utf8,你必须调节以下在httpd.conf文件里的变量:AddDefaultCharset,CharsetDefault和CharsetSourceEnc。如果你的html文件源码没有用utf8编码,那它们必须经过iconv或者recode的转换。



打印

更新于2007年 6月 4日

本翻译的原始版本已经不再被维护

总结: MySQL团队很荣幸地宣布MySQL 5.0很快就要出现在Gentoo稳定的软件包树里了。这个指南描述了如何升级到MySQL 4.*或5.0.*。

Michael Kohl
作者

Francesco Riosa
作者

江泽洲
译者

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.