系统环境
系统 | MariaDB | MySQL |
---|---|---|
CentOS 7.9 | 5.5.68-MariaDB | MySQL-8 |
环境检查
在进行升级之前,首先验证一下当前的数据库版本以及数据库配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29MariaDB [(none)]> select version();
+----------------+
| version() |
+----------------+
| 5.5.68-MariaDB |
+----------------+
1 row in set (0.00 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| cr_debug |
| easydb_build |
| evaluation_build |
| mysql |
| performance_schema |
| test |
+--------------------+
7 rows in set (0.06 sec)
MariaDB [(none)]> show global variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | OFF |
+-----------------------+-------+
1 row in set (0.01 sec)检查 /var/lib/mysql 目录有哪些文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34# ls -l /var/lib/mysql/
total 643112
-rw-rw---- 1 mysql mysql 16384 Oct 15 08:33 aria_log.00000001
-rw-rw---- 1 mysql mysql 52 Oct 15 08:33 aria_log_control
drwx------ 2 mysql mysql 149 Oct 14 17:18 cr_debug
drwx------ 2 mysql mysql 8192 Oct 14 17:19 easydb_build
drwx------ 2 mysql mysql 255 Oct 14 17:19 evaluation_build
-rw-rw---- 1 mysql mysql 648019968 Oct 15 08:33 ibdata1
-rw-rw---- 1 mysql mysql 5242880 Oct 15 08:39 ib_logfile0
-rw-rw---- 1 mysql mysql 5242880 Oct 15 08:39 ib_logfile1
drwx------ 2 mysql mysql 4096 Oct 14 17:18 mysql
srwxrwxrwx 1 mysql mysql 0 Oct 15 08:39 mysql.sock
drwx------ 2 mysql mysql 4096 Oct 14 17:11 performance_schema
drwx------ 2 mysql mysql 6 Oct 14 17:11 test
# ls -l /var/lib/mysql/easydb_build/
total 1592
-rw-rw---- 1 mysql mysql 8924 Oct 14 17:18 basic_information_data.frm
-rw-rw---- 1 mysql mysql 8997 Oct 14 17:18 calculation_section.frm
-rw-rw---- 1 mysql mysql 8968 Oct 14 17:18 car_apply_image.frm
-rw-rw---- 1 mysql mysql 8988 Oct 14 17:18 company_apply_image.frm
-rw-rw---- 1 mysql mysql 8854 Oct 14 17:18 contract_apply_image.frm
-rw-rw---- 1 mysql mysql 9404 Oct 14 17:18 dbo@002etbcmcarrier.frm
-rw-rw---- 1 mysql mysql 61 Oct 14 17:18 db.opt
-rw-rw---- 1 mysql mysql 9126 Oct 14 17:18 deduction.frm
-rw-rw---- 1 mysql mysql 9112 Oct 14 17:18 fauser.frm
-rw-rw---- 1 mysql mysql 8896 Oct 14 17:18 formula_string.frm
-rw-rw---- 1 mysql mysql 8785 Oct 14 17:18 GPS_WAYBILLDTL.frm
-rw-rw---- 1 mysql mysql 9102 Oct 14 17:18 hr_basic_dept.frm
-rw-rw---- 1 mysql mysql 17381 Oct 14 17:18 hr_department.frm
-rw-rw---- 1 mysql mysql 40044 Oct 14 17:18 hr_emp.frm
-rw-rw---- 1 mysql mysql 9374 Oct 14 17:18 line_approval_result.frm
-rw-rw---- 1 mysql mysql 8817 Oct 14 17:18 line_estimate_value.frm
... 省略 N 行 ...可以看到 /var/lib/mysql 目录有一个 InnoDB 表空间文件:ibdata1。以及 aria 文件,
easydb_build
数据库目录中有 .frm 文件。
升级到 MySQL 5.7
安装 MySQL Community 的 yum 仓库
1
yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-2.noarch.rpm
停止 MariaDB 数据库服务,在升级 MySQL 系统时,我总是建议在停止 mysqld 之前将
innodb_fast_shutdown
设置为 0。这将强制将 InnoDB 缓冲池中的脏页写入磁盘并在 mysqld 的启动过程中从撤消日志中绕过 InnoDB Recovery1
2
3
4
5MariaDB [(none)]> set global innodb_fast_shutdown=0;
Query OK, 0 rows affected (0.00 sec)
# systemctl stop mariadb.service
# systemctl disable mariadb.service安装 MySQL 5.7(启用 5.7 repo 并禁用 8.0 的 repo)
1
2yum install -y mysql-community-server mysql-community-client \
--enablerepo=mysql57-community --disablerepo=mysql80-community可以看到 MySQL 5.7 现在正在取代旧的 MariaDB
1
2
3
4
5
6
7
8
9
10
11... 省略 N 行
Installed:
mysql-community-client.x86_64 0:5.7.35-1.el7 mysql-community-libs.x86_64 0:5.7.35-1.el7 mysql-community-libs-compat.x86_64 0:5.7.35-1.el7 mysql-community-server.x86_64 0:5.7.35-1.el7
Dependency Installed:
mysql-community-common.x86_64 0:5.7.35-1.el7
Replaced:
mariadb.x86_64 1:5.5.68-1.el7 mariadb-libs.x86_64 1:5.5.68-1.el7 mariadb-server.x86_64 1:5.5.68-1.el7
Complete!启动 mysqld 服务然后执行
mysql_upgrade
进程1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24# systemctl start mysqld
# mysql_upgrade -h 192.168.55.42 -uroot -p
Enter password:
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
mysql_upgrade: (non fatal) [ERROR] 1728: Cannot load from mysql.proc. The table is probably corrupted
mysql_upgrade: (non fatal) [ERROR] 1545: Failed to open mysql.event
Checking system database.
mysql.columns_priv OK
mysql.db OK
mysql.engine_cost OK
mysql.event OK
... 省略 N 行
`evaluation_build`.`tecm_bset_warehouse`
Running : ALTER TABLE `evaluation_build`.`tecm_bset_warehouse` FORCE
status : OK
`evaluation_build`.`tecm_judgingconditions`
Running : ALTER TABLE `evaluation_build`.`tecm_judgingconditions` FORCE
status : OK
Upgrade process completed successfully.
Checking if update is needed.应该会出现一些与 mysql_upgrade 修复的损坏表相关的非致命错误;
重启 MySQL 服务,配置开机启动
1
2# systemctl restart mysqld
# systemctl enable mysqld检查升级完成后检查数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.35 |
+-----------+
1 row in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| cr_debug |
| easydb_build |
| evaluation_build |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
8 rows in set (0.03 sec)
mysql> show global variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.01 sec)
升级到 MySQL 8.0
实用程序-升级检查器
以下步骤不是强制性的,但强烈推荐。在升级到 MySQL 8.0 之前,您应该安装新的 MySQL Shell 并查看正在运行的新升级检查器工具!
执行以下命令安装
mysql-shell
1
yum install -y mysql-shell
执行以下命令检查升级兼容性
1
mysqlsh -- util check-for-server-upgrade root@localhost --output-format=JSON > mysql_upgrade_check.json
以上命令会将结果输出到
mysql_upgrade_check.json
文件中,检察该文件,确定没有出现 Error1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16Save password for 'root@localhost'? [Y]es/[N]o/Ne[v]er (default No): ESC[70GESC[JESC[70G{
"serverAddress": "localhost",
"serverVersion": "5.7.36-log - MySQL Community Server (GPL)",
"targetVersion": "8.0.27",
"errorCount": 0,
"warningCount": 801,
"noticeCount": 1,
"summary": "No fatal errors were found that would prevent an upgrade, but some potential issues were detected. Please ensure that the reported issues are not significant before upgrading.",
"checksPerformed": [
{
"id": "oldTemporalCheck",
"title": "Usage of old temporal type",
"status": "OK",
"detectedProblems": []
},
...如上所示,没有错误,如果出现错误信息,需要参考描述以及官方文档进行修复,否则升级后数据库会启动失败!!!
安装 MySQL 8.0
现在,如果您想继续升级到 MySQL 8.0。像以前一样再次停止 mysqld 并安装 MySQL 8.0 二进制文件
1
2
3
4mysql -uroot -p -e 'set global innodb_fast_shutdown=0';
# 停止 MySQL 服务
systemctl stop mysqld执行以下命令升级 MySQL
1
yum upgrade -y mysql-community-server mysql-community-client
检察 MySQL 配置文件,需要修改一部分配置,如下:
query_cache 相关的配置,在 MySQL 8.0 之中被删除,所有的参数需要去掉,如下参数
- query_cache_type
- query_cache_size
- query_cache_limit
MySQL 8.0 删除了 sql_mode 中的 NO_AUTO_CREATE_USER,如果配置文件中有些 sql_mode 参数,需要去掉这个值
确认配置文件无误后,启动 MySQL
1
systemctl start mysqld
MySQL 8.0.16 以下的版本,需要执行以下命令升级 MySQL 的系统配置,8.0.16 以上的不需要
1
mysql_upgrade
检查
我们现在还可以验证 MySQL 的 datadir 并看到现在
.frm
文件已经消失了,因为 MySQL 8.0 使用了新的数据字典:1
ls /var/lib/mysql/easydb_build/ -lh |grep ".frm"
我们可以注意到并不是所有的表都有自己的表空间。这可以通过以下查询进行验证:
1
2
3use information_schema;
select NAME, ROW_FORMAT, SPACE_TYPE from INNODB_TABLES where name like 'evaluation_build/%';
概括
要从 MariaDB 升级到 MySQL,您需要执行以下简单步骤:
- 停止 MariaDB 服务
- 安装 MySQL 5.7 服务
- 启动 MySQL 5.7 服务,并运行
mysqld_upgrade
- 运行 MySQL 8.0 的 mysql-shell 升级检查工具
- 停止 MySQL 服务
- 升级 MySQL 到 MySQL 8.0
- 启动 MySQL 8.0 服务,如果 MySQL 版本小于 8.0.16,则运行 mysql_upgrade 然后重启 mysqld
- 如果 MySQL 版本大于 8.0.16 则只要启动 mysqld 服务即可
关于 MySQL 8.0.16 的新的升级方式
MySQL 版本大于 8.0.16 时,在 mysqld 额外添加了一个新的选项 --upgrade
。可选值为 NONE
,AUTO
,MINIMAL
,FORCE
。
使用方法如下:
1
/usr/local/mysql/bin/mysqld --upgrade=NONE
选项都代表什么?
- NONE: 不尝试进行升级
- AUTO: 默认选项,MySQL 进行数据字典升级和服务升级
- MINIMAL: 仅升级数据字典
- FORCE: 强制升级,类似旧的 mysql_upgrade –force