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

本文档提供从 MySQL 4.1 到 5.0 的详细升级步骤,包括直接升级、备份与恢复、二进制包升级等过程,同时介绍了字符集转换的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ySQL 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的转换。


    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值