升级方式介绍
08 数据库服务版本升级方法
5.6 -- 5.7 -- 8.0
数据库版本升级方法:
Inplace-本地升级
- 步骤一:在同一台服务器中,需要部署高版本数据库服务实例
- 步骤二:低版本数据库中的数据进行备份迁移,迁移到高版本服务中 (物理备份方式-停止服务)
- 步骤三:运行启动高版本数据库服务实例,进行测试
- 步骤四:停止低版本数据库服务,将业务迁移到新版数据库
Mergeing-迁移
步骤一:在不同服务器中,可以部署高版本数据库服务实例
步骤二:低版本数据库中的数据进行备份迁移,迁移到高版本服务中 (逻辑备份方式/主从同步)
步骤三:运行启动高版本数据库服务实例,进行测试
步骤四:停止低版本数据库服务,将业务迁移到新版数据库
升级时,数据内容不变,数据结构变
- 查看8.0和5.7的区别
sh
[root@db01~]# ll /data/3306/data/
总用量 191000
-rw-r----- 1 mysql mysql 56 6月 15 12:32 auto.cnf
-rw-r----- 1 mysql mysql 1428 6月 15 14:24 binlog.000001
-rw-r----- 1 mysql mysql 179 6月 15 14:49 binlog.000002
-rw-r----- 1 mysql mysql 462 6月 15 14:51 binlog.000003
-rw-r----- 1 mysql mysql 4937 6月 15 18:09 binlog.000004
-rw-r----- 1 mysql mysql 179 6月 15 19:17 binlog.000005
-rw-r----- 1 mysql mysql 1002 6月 15 20:48 binlog.000006
-rw-r----- 1 mysql mysql 179 6月 15 21:47 binlog.000007
-rw-r----- 1 mysql mysql 179 6月 15 21:48 binlog.000008
-rw-r----- 1 mysql mysql 179 6月 15 21:56 binlog.000009
-rw-r----- 1 mysql mysql 179 6月 15 22:10 binlog.000010
-rw-r----- 1 mysql mysql 179 6月 17 08:47 binlog.000011
-rw-r----- 1 mysql mysql 1610 6月 17 14:38 binlog.000012
-rw-r----- 1 mysql mysql 179 6月 17 15:40 binlog.000013
-rw-r----- 1 mysql mysql 179 6月 17 15:40 binlog.000014
-rw-r----- 1 mysql mysql 179 6月 17 15:44 binlog.000015
-rw-r----- 1 mysql mysql 578 6月 17 16:37 binlog.000016
-rw-r----- 1 mysql mysql 179 6月 17 17:34 binlog.000017
-rw-r----- 1 mysql mysql 6323 6月 17 21:39 binlog.000018
-rw-r----- 1 mysql mysql 1623 6月 17 21:57 binlog.000019
-rw-r----- 1 mysql mysql 304 6月 17 21:39 binlog.index
-rw------- 1 mysql mysql 1676 6月 15 12:32 ca-key.pem
-rw-r--r-- 1 mysql mysql 1112 6月 15 12:32 ca.pem
-rw-r--r-- 1 mysql mysql 1112 6月 15 12:32 client-cert.pem
-rw------- 1 mysql mysql 1680 6月 15 12:32 client-key.pem
-rw-r----- 1 mysql mysql 7442 6月 17 17:34 db01.err
-rw-r----- 1 mysql mysql 6 6月 17 21:39 db01.pid
-rw-r----- 1 mysql mysql 196608 6月 17 21:57 #ib_16384_0.dblwr
-rw-r----- 1 mysql mysql 8585216 6月 15 12:32 #ib_16384_1.dblwr
-rw-r----- 1 mysql mysql 3527 6月 17 21:39 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 6月 17 21:57 ibdata1
-rw-r----- 1 mysql mysql 50331648 6月 17 21:57 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 6月 15 12:32 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 6月 17 21:39 ibtmp1
drwxr-x--- 2 mysql mysql 187 6月 17 21:39 #innodb_temp
drwxr-x--- 2 mysql mysql 143 6月 15 12:32 mysql
-rw-r----- 1 mysql mysql 27262976 6月 17 21:57 mysql.ibd
drwxr-x--- 2 mysql mysql 8192 6月 15 12:32 performance_schema
-rw------- 1 mysql mysql 1680 6月 15 12:32 private_key.pem
-rw-r--r-- 1 mysql mysql 452 6月 15 12:32 public_key.pem
-rw-r--r-- 1 mysql mysql 1112 6月 15 12:32 server-cert.pem
-rw------- 1 mysql mysql 1680 6月 15 12:32 server-key.pem
drwxr-x--- 2 mysql mysql 28 6月 15 12:32 sys
-rw-r----- 1 mysql mysql 16777216 6月 17 21:57 undo_001
-rw-r----- 1 mysql mysql 16777216 6月 17 21:51 undo_002
drwxr-x--- 2 mysql mysql 20 6月 17 21:08 wzy
[root@db01~]# ll /data/3357/data/
总用量 110660
-rw-r----- 1 mysql mysql 56 6月 15 22:44 auto.cnf
-rw------- 1 mysql mysql 1676 6月 15 22:44 ca-key.pem
-rw-r--r-- 1 mysql mysql 1112 6月 15 22:44 ca.pem
-rw-r--r-- 1 mysql mysql 1112 6月 15 22:44 client-cert.pem
-rw------- 1 mysql mysql 1680 6月 15 22:44 client-key.pem
-rw-r----- 1 mysql mysql 351 6月 17 08:49 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 6月 17 08:49 ibdata1
-rw-r----- 1 mysql mysql 50331648 6月 17 08:49 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 6月 15 22:44 ib_logfile1
drwxr-x--- 2 mysql mysql 4096 6月 15 22:44 mysql
drwxr-x--- 2 mysql mysql 8192 6月 15 22:44 performance_schema
-rw------- 1 mysql mysql 1680 6月 15 22:44 private_key.pem
-rw-r--r-- 1 mysql mysql 452 6月 15 22:44 public_key.pem
-rw-r--r-- 1 mysql mysql 1112 6月 15 22:44 server-cert.pem
-rw------- 1 mysql mysql 1680 6月 15 22:44 server-key.pem
drwxr-x--- 2 mysql mysql 8192 6月 15 22:44 sys
升级注意事项
数据库版本升级规则:官方参考链接
-
数据库服务版本升级时,只支持在GA(General Availability)版本之间进行升级
-
数据库服务版本升级时,支持从数据库5.6到5.7再到8.0,跨版本升级,但是建议先将5.6升级到最新版本,在进行跨版本升级。避免跨越的版本过多而导致的升级失败
-
数据库服务版本升级时,需要提前考虑好版本回退的方案,最好升级前做好数据备份(特别是向8.0版本升级)
-
数据库服务版本升级时,制定的升级方案和升级步骤,需要尽可能降低数据库服务停机的时间
下图为非GA版本
升级流程
数据库版本升级流程:
- 数据库服务数据备份保存(可以采用热备和冷备两种方案,冷备是需要停止业务后备份,热备是无需停止业务备份)
- 数据库服务最新程序安装(最新版本数据库服务安装过程时,无需停止原有数据库旧版服务)
- 数据库服务原有程序关闭(网站显示维护页面)
- 数据库服务最新程序启动(加载原有程序数据实现挂库升级,并采用跳过授权表和跳过网络方式启动)
- 数据库服务升级数据结构(数据库服务升级程序后,还需要升级数据系统结构信息,因此升级时间和数据量无关)
- 数据库服务可以正常重启(数据库服务升级完毕后,确认数据库服务是可以正常完成重启操作)
- 数据库服务功能测试验证(反复核实验证与数据库服务相关的各项功能是否正常)
- 数据库服务升级工作完毕(取消网站维护页面,恢复正常网站线上运营业务)
5.6本地升级5.7案例
MySQL5.6部署
下载地址:https://downloads.mysql.com/archives/get/p/23/file/mysql-5.6.48-linux-glibc2.12-x86_64.tar.gz
准备相关目录,略。
注意不要有/etc/my.cnf,否则影响初始化
1.MySQL5.6初始化安装命令如下:
bash
/usr/local/mysql3356/scripts/mysql_install_db \
--user=mysql \
--basedir=/usr/local/mysql3356 \
--datadir=/data/3356/data
2.准备启动文件
bash
cat > /data/3356/my.cnf <<eof
[mysqld]
user=mysql
port=3356
basedir=/usr/local/mysql56
datadir=/data/3356/data
socket=/tmp/mysql3356.sock
eof
sh
cat >/etc/systemd/system/mysqld3356.service <<eof
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Instal1]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql3356/bin/mysqld --defaults-file=/data/3356/my.cnf
LimitNOFILE=65535
eof
3.启动数据库并连接测试。可以发现为无密码登录
bash
[root@db51~]# systemctl daemon-reload
[root@db51~]# systemctl start mysqld3356
[root@db51~]# mysql -S /tmp/mysql3356.sock -uroot
-bash: mysql: command not found
[root@db51~]# /usr/local/mysql/bin/mysql -S /tmp/mysql3356.sock -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.48 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
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> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
mysql>
MySQL5.7部署
下载软件程序: https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.40-linux-glibc2.12-x86_64.tar.gz
准备相关目录略
1.初始化:
bash
/usr/local/mysql3357/bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql57 \
--datadir=/data/3357/data
2.书写数据库配置
sh
cat > /data/3357/my.cnf <<eof
[mysqld]
user=mysql
port=3357
basedir=/usr/local/mysql3357
datadir=/data/3357/data
socket=/tmp/mysql3357.sock
eof
systemctl管理文件
sh
cat >/usr/lib/systemd/system/mysqld3357.service<<EOF
[Unit]
Description=MySQL Server
Documentation=mysqld.service
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql3357/bin/mysqld --defaults-file=/data/3357/my.cnf
LimitNOFILE = 35535
EOF
使用systemctl启动后,查看端口
sh
[root@db01local]# ss -antl|grep 335
LISTEN 0 80 [::]:3356 [::]:*
LISTEN 0 80 [::]:3357 [::]:*
登录
sh
[root@db01local]# /usr/local/mysql57/bin/mysql -S /tmp/mysql3357.sock -P 3357
Server version: 5.7.30 MySQL Community Server (GPL)
mysql>
创建测试用的表
mysql
create database xiaoA;
use xiaoA;
create table t1 (id int,name char(10),age int);
insert into t1 values (1,'wenzy',20),(2,'girl',21),(3,'baby',22);
create database xiaoB;
然后停止MySQL5.6版本的数据库
MySQL5.6升级到5.7
5.6 -- 5.7
步骤一:进行数据库服务备份操作
物理备份 逻辑备份-mysqldump 主从同步
步骤二:将原有数据信息导入到新版数据库服务
迁移恢复数据
步骤三:进行前期新版数据库功能测试
web服务器(程序代码)--- 5.7数据库服务(业务数据) -- 浏览器访问测试
步骤四:停止旧版数据库服务 (网站维护页通知)
systemctl stop mysqld3356.service
步骤五:备份原有数据信息
物理备份:cp -ar /data/3356/data/ /backup/mysql3356/
步骤六:实现数据挂库升级
更改mysql56的配置文件,basedir。
为什么:不把mysql3357的配置文件改为datadir=/data/3356/data
答:应用程序需要连接数据库,这样改变了端口,变动较大。不稳定
1.修改MySQL5.6的程序目录为新版MySQL5.7
sh
[root@db01~]# vim /data/3356/my.cnf
[mysqld]
server_id=3356
port=3356
user=mysql
basedir=/usr/local/mysql57
datadir=/data/3356/data
socket=/tmp/mysql3356.sock
2.启动新数据库
bash
/usr/local/mysql3357/bin/mysqld_safe \
--defaults-file=/data/3356/my.cnf \
--skip-grant-tables \
--skip-networking &
3.连接新数据库,可以发现成了5.7版本。授权信息但是没有
bash
[root@db51~]# mysql -S /tmp/mysql3356.sock -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.30 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| xiaoA |
| xiaoB |
+--------------------+
# 这是 MySQL5.6的授权表信息
mysql> select * from mysql.user \G
*************************** 2. row ***************************
Host: db51
User: root
Password:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
4.修改授权表结构
bash
/usr/local/mysql3357/bin/mysql_upgrade -S /tmp/mysql3356.sock --force
5.在此查看授权表信息
bash
# 升级后的密码信息
account_locked: N
*************************** 7. row ***************************
Host: localhost
User: mysql.session
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
5.修改数据库启动配置,然后正常启动新版数据库服务
bash
pkill -9 mysql
cat > /etc/systemd/system/mysqld3356.service <<'EOF'
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Instal1]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql3357/bin/mysqld --defaults-file=/data/3356/my.cnf
LimitNOFILE=65535
EOF
systemctl daemon-reload
systemctl start mysqld3356
6.验证新版数据库MySQL5.7权限信息正确
bash
[root@db51~]# mysql -S /tmp/mysql3356.sock
Welcome to the MySQL monitor. Commands end with ; or \g.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
| xiaoA |
| xiaoB |
+--------------------+
7 rows in set (0.00 sec)
mysql> create database wenzy;
Query OK, 1 row affected (0.00 sec)
sql -S /tmp/mysql3356.sock
Welcome to the MySQL monitor. Commands end with ; or \g.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
| xiaoA |
| xiaoB |
+--------------------+
7 rows in set (0.00 sec)
mysql> create database wenzy;
Query OK, 1 row affected (0.00 sec)