ySQL 4.*或5.0.*的升级指南
4.1的myisam存储引擎已经足够成熟了,它允许直接升级到下一个MySQL的主版本。
注意: 对于MERGE表来说不是这样。如果你尝试直接升级这种很少用的表类型你可能会陷入麻烦。你应该清除并重建这些表,并且在升级过程中把他们的内容储存起来。如果你不太确定,你应该从Upgrading |
在这一步需要两个命令行,因为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 |
用户从老的MySQL版本(<4.0.24)升级需要现安装MySQL 4.0.25。如果你已有一个更新的版本,你可以跳过这一区域,并从next
one继续。
代码 2.1: 简单升级 |
# emerge -av --buildpkg "<mysql-4.1"
|
重要: 在不同的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语言描述的,它是一种结构化查询语言。
现在是检查你的备份是否正常工作的好时间了。
如果你跳过了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 |
重要: 管理的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 。
如果你不喜欢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客户端共享组件。 |
这一章并不打算成为一个如何做这样的转换的详尽的指南,反倒要成为一个读者可以推敲的短小的提示列表。
转换一个数据库可能是一个复杂的任务,并且难度随着数据的不同而增加。像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 Gentoo和Localization
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。
由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。
你可以使用CONVERT()和CAST()这两个MySQL函数来转换在你的SQL脚本中的数据。
为了apache使用utf8,你必须调节以下在httpd.conf文件里的变量:AddDefaultCharset,CharsetDefault和CharsetSourceEnc。如果你的html文件源码没有用utf8编码,那它们必须经过iconv或者recode的转换。