原文地址:http://mysqlserverteam.com/upgrading-directly-from-mysql-5-0-to-5-7-using-an-in-place-upgrade/
作者:Susan Koerner
这篇文章是关于mysql升级系列的第二部分。第一篇文章,使用mysqldump 直接从5.0升级至5.7,讨论了使用mysqldump程序进行升级。我们称之为 'Dump' 升级。在这篇文章中,我们将讨论的升级方式称之为 'In Place', 也称为二进制升级或实时升级。
警告:
尽管官方不支持,我们觉得分享可以从5.0升级至5.7也是有价值的。这种升级的一大障碍就是,随着功能的升级,你可能错过弃用警告和其他的行为变化。因此,这种升级会有很大的风险。
就像'Dump'升级,最好在进行任何操作前备份数据库。在进行升级操作前,请务必阅读想要升级版本的相关文档。这可以包括关于升级的重要提示和信息:upgrading to 5.1, upgrading to 5.5, upgrading to 5.6 or upgrading to 5.7。
'In Place' 升级比'Dump'升级要快,因为你省去了导入数据的步骤。这样节省了时间,但升级前的备份就更加重要,因为你就是在原始目录上执行升级操作。你使用相同的数据文件,你就不能使用一些需要重建数据库才能使用的新功能,比如创建undo tablespaces(在5.6.3版本引入)或将已经存在的表改到独立表空间中(innodb_file_per_table 在5.6.6开始支持)。
我使用如下步骤进行升级:
启动5.0.96版本实例,导入sakila schema数据。为了简单,使用 --no-defaults。
$ cd
$ ./scripts/mysql_install_db --no-defaults --datadir= --basedir=.
$ ./bin/mysqld_safe --no-defaults --datadir= --basedir=. --port= --socket= &
$ ./bin/mysql -uroot --socket= --execute="create database sakila;"
$ ./bin/mysql -uroot --socket= --execute="source sakila-schema.sql" --database=sakila
$ ./bin/mysql -uroot --socket= --execute="source sakila-data.sql" --database=sakila
关闭数据库服务。这是你备份数据库的好时间。然后,进入新版本MySQL的文件夹,启动数据库。使用相同的数据目录,所以你的所有数据都在中
$ cd
$ ./bin/mysqladmin -uroot --socket= shutdown
$ cd
$ ./bin/mysqld_safe --no-defaults --datadir= --basedir=.
--port=< PORT> --socket= --skip-grant-tables &
请注意,当第一次启动5.7版本数据库时,必须使用 --skip-grant-tables。
运行 mysql_upgrade。这样会升级所有的系统表和检查用户库。
$ ./bin/mysql_upgrade -uroot --socket=
导入帮助表(可选)
$ ./bin/mysql -uroot --socket= --execute="source ./share/fill_help_tables.sql" mysql
重启MySQL服务
$ ./bin/mysqladmin -uroot --socket= shutdown
$ ./bin/mysqld_safe --no-defaults --datadir= --basedir=.
--port= --socket= &
运行mysqlcheck检查数据库状态
$ ./bin/mysqlcheck -uroot --socket= --all-databases
如果从5.0.96升级,这种升级方法可能需要重建一些表或触发器。在本文使用的sakila 条件下,我收到了下面的警告信息:
Warning : Triggers for table `sakila`.`customer` have no creation context
Warning : Triggers for table `sakila`.`film` have no creation context
Warning : Triggers for table `sakila`.`payment` have no creation context
Warning : Triggers for table `sakila`.`rental` have no creation context
由于触发器存储的元数据的更改,需要重载。我使用下面的步骤重建触发器:
使用mysqldump导出触发器
$ ./bin/mysqldump --socket= -uroot --triggers --no-create-db --no-data --no-create-info --all-databases > addtriggers.sql
生成一个sql去删掉存在的触发器。排除sys库,因为上面的mysqldump不会导出sys库中的触发器。
mysql> SELECT CONCAT('DROP TRIGGER ', TRIGGER_SCHEMA, '.',
TRIGGER_NAME, ';')
FROM INFORMATION_SCHEMA.TRIGGERS
WHERE trigger_schema not in ('sys')
INTO OUTFILE 'droptriggers.sql';
删掉存在的触发器
$ ./bin/mysql --socket= -uroot --execute="source droptriggers.sql"
重载触发器
$ ./bin/mysql --socket= -uroot --execute="source addtriggers.sql"
运行mysqlcheck
$ ./bin/mysqlcheck -uroot --socket= --all-databases
使用上面的步骤从5.0.96、5.1.73、5.5.46和5.6.27 升级到5.7.9,均是成功的。使用mysqlcheck,统计所有库的表、列和程序的数量,运行基础的select/insert/update/delete 语句并执行、调用用户函数和存储过程来进行验证。
(注:在这篇文章写的时候,还不支持5.5到5.7版本的复制,在5.7.13版本时,修复了该bug)
翻译的不好,欢迎批评
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com