MySQL 5.0.88 升级到最新版本

Dev*_*amy 6 mysql upgrade mysql-5.0

我有一些关于从 5.0.88 升级到最新版本的问题。

  1. 我为什么要升级?
  2. 如果是这样,我应该考虑哪个版本?
  3. 所有已知的风险是什么?
  4. 是否建议逐步升级?还是建议使用二进制替换?

Rol*_*DBA 7

我为什么要升级?

对于 MySQL 5.1.37 及更早版本,InnoDB 不利用多 CPU/多核。再多的硬件扩展也不会使 InnoDB 运行得更快。MySQL 5.1.38 首次引入了 InnoDB 插件,该插件具有许多方面的调优功能,现在可用于多 CPU/多核交互。现在,它在 MySQL 5.5./5.6 中作为本机 InnoDB 完全可用。这是我过去关于这个主题的帖子

如果是这样,我应该考虑哪个版本?

尽管它是在 2 个月前发布的,但到目前为止我还是相信 MySQL 5.6.10。我已经从 MySQL 5.0.51a 给了一个客户端那个版本。查看来自以下内容的帖子Jan 19, 2012我应该使用哪个版本的 MySQL?. 客户端的生产服务器正在复制到新的 MySQL 5.6 集群并等待客户端切换。

所有已知的风险是什么

与 MySQL 的任何版本一样,您应该始终阅读发行说明。唯一需要担心的是没有正确进行升级。另一个风险是忘记运行mysql_upgrade脚本来修复mysql.user表格的列布局。

建议逐步升级?或二进制替换建议?

就个人而言,我对二进制替换感到不舒服。我有一种方法可以从 MySQL 5.0.88 直接升级到 MySQL 5.6.10。

步骤 01:mysqldump 除 mysql 架构外的所有数据库

MYSQL_CONN="-uroot -ppassword"
SQLSTMT="SELECT GROUP_CONCAT(schema_name SEPARATOR ' ')"
SQLSTMT="${SQLSTMT} FROM information_schema.schemata WHERE schema_name"
SQLSTMT="${SQLSTMT} NOT IN ('information_schema','mysql')"
DBLIST=`mysql ${MYSQL_CONN} -ANe"${SQLSTMT}"`
MYSQLDUMP_OPTIONS="--single-transaction --routines --triggers --databases ${DBLIST}"
mysqldump ${MYSQL_CONN} ${MYSQLDUMP_OPTIONS} > Data.sql
Run Code Online (Sandbox Code Playgroud)

步骤 02:将授权转储为纯 SQL 命令

MYSQL_CONN="-uroot -ppassword"
SQLSTMT="SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';')"
SQLSTMT="${SQLSTMT} FROM mysql.user WHERE user<>''"
mysql ${MYSQL_CONN} -ANe"${SQLSTMT}" | mysql ${MYSQL_CONN} -AN | sed 's/$/;/g' > Grants.sql
Run Code Online (Sandbox Code Playgroud)

我之前推荐过这种技术:将 myisam 5.0 数据库导入 5.5 innodb 服务器

STEP 03 将每个文件加载到一个新的 MySQL 5.6 Instance

在你做任何事情之前,你已经在 MySQL 5.6 中为 root@localhost 设置了密码

临时密码位于~/.mysql_secret. 使用该密码以 root@localhost 身份登录。然后,使用以下命令更改密码

SET PASSWORD=PASSWORD('whateverIwantasthenewpassword');
Run Code Online (Sandbox Code Playgroud)

在 MySQL 客户端中,只需运行

source Data.sql
source Grants.sql
Run Code Online (Sandbox Code Playgroud)

这就是所需要的。

试一试 !!!

更新 2019-06-24 13:30 EDT

为了 Linux 用户的利益并为了回应@SherylHohman 的评论,我在 Vagrant 环境中测试了 STEP 01 和 STEP 02 中没有定义 MYSQL_CONN(故意留空)的上述语句:

root@vt-mysql:~# mkdir DBAStackExchange
root@vt-mysql:~# cd DBAStackExchange
root@vt-mysql:~/DBAStackExchange# ls -l
total 0
root@vt-mysql:~/DBAStackExchange# SQLSTMT="SELECT GROUP_CONCAT(schema_name SEPARATOR ' ')"
root@vt-mysql:~/DBAStackExchange# SQLSTMT="${SQLSTMT} FROM information_schema.schemata WHERE schema_name"
root@vt-mysql:~/DBAStackExchange# SQLSTMT="${SQLSTMT} NOT IN ('information_schema','mysql')"
root@vt-mysql:~/DBAStackExchange# DBLIST=`mysql ${MYSQL_CONN} -ANe"${SQLSTMT}"`
root@vt-mysql:~/DBAStackExchange# MYSQLDUMP_OPTIONS="--single-transaction --routines --triggers --databases ${DBLIST}"
root@vt-mysql:~/DBAStackExchange# mysqldump ${MYSQL_CONN} ${MYSQLDUMP_OPTIONS} > Data.sql
root@vt-mysql:~/DBAStackExchange#
root@vt-mysql:~/DBAStackExchange#
root@vt-mysql:~/DBAStackExchange# SQLSTMT="SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';')"
mysql ${MYSQL_CONN} -ANe"${SQLSTMT}" | mysql ${MYSQL_CONN} -AN | sed 's/$/;/g' > Grants.sqlroot@vt-mysql:~/DBAStackExchange# SQLSTMT="${SQLSTMT} FROM mysql.user WHERE user<>''"
root@vt-mysql:~/DBAStackExchange# mysql ${MYSQL_CONN} -ANe"${SQLSTMT}" | mysql ${MYSQL_CONN} -AN | sed 's/$/;/g' > Grants.sql
root@vt-mysql:~/DBAStackExchange#
root@vt-mysql:~/DBAStackExchange#
root@vt-mysql:~/DBAStackExchange# ls -l
total 4056
-rw-r--r-- 1 root root 4146556 Jun 24 10:22 Data.sql
-rw-r--r-- 1 root root    1326 Jun 24 10:23 Grants.sql
root@vt-mysql:~/DBAStackExchange# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 43
Server version: 5.6.33-0ubuntu0.14.04.1 (Ubuntu)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
Run Code Online (Sandbox Code Playgroud)

我 6 年前在这里发表的声明仍然适用于 Linux。我在 MySQL 5.6.33 中运行这些