本文源库和目标库都是采用二进制tar包进行的安装,非rpm和源码编译方式安装。
迁移要求
由于Centos即将停止维护,客户强烈要求操作系统更改成Ubuntu18.04,需将Centos的MySQL迁移至Ubuntu。考虑到数据目录小才1.8G,业务可以停止,随进行了目录拷贝方式实现异构迁移。
OS version | DB version | ip addr | 安装方式 | |
源库 | Centos7.6 x86_64 | MySQL8.0.35 | 192.168.3.10 | 二进制tar包 |
目标库 | Ubuntu18.04 x86_64 | MySQL8.0.35 | 192.168.3.20 | 未安装数据库软件 |
迁移步骤
迁移前准备(目标库)
系统参数配置
sysctl.conf配置
--备份
cp /etc/sysctl.conf /etc/sysctl.conf_bak_20240119
--添加mysql方面的内容
cat >> /etc/sysctl.conf <<EOF
#add by mysql
#/proc/sys/kernel/优化
# 10000 connect remain:
kernel.sem = 250 162500 250 650
#notice: shall shmmax is base on 16GB, you may adjust it for your MEM
#TODO: open blow two paramenter may make error like this: can not fork xxxx, just reboot your computer ~
#for 2GB Mem:
#kernel.shmall = 419430
#kernel.shmmax = 171796918
#for 4GB Mem:
#kernel.shmall = 838860
#kernel.shmmax = 3435973836
#for 8GB Mem:
#kernel.shmall = 1677721
#kernel.shmmax = 6871947673
#for 16GB Mem:
#kernel.shmall = 3774873
#kernel.shmmax = 8589934592
#for 32GB Mem:
kernel.shmall = 7549747
kernel.shmmax = 17179869184
#for 64GB Mem:
#kernel.shmall = 15099494
#kernel.shmmax = 34359738368
#for 128GB Mem:
#kernel.shmall = 30198988
#kernel.shmmax = 68719476736
#for 256GB Mem:
#kernel.shmall = 60397977
#kernel.shmmax = 137438953472
#for 512GB Mem:
#kernel.shmall = 120795955
#kernel.shmmax = 274877906944
kernel.shmmni = 4096
vm.dirty_background_ratio=2
vm.dirty_ratio = 40
vm.overcommit_memory = 2
vm.overcommit_ratio = 90
vm.swappiness = 0
fs.aio-max-nr = 1048576
fs.file-max = 6815744
fs.nr_open = 20480000
# TCP端口使用范围
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 6000
# 记录的那些尚未收到客户端确认信息的连接请求的最大值
net.ipv4.tcp_max_syn_backlog = 65536
# 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.somaxconn=1024
net.core.netdev_max_backlog = 32768
net.core.wmem_default = 8388608
net.core.wmem_max = 1048576
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_syn_retries = 2
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_wmem = 8192 436600 873200
net.ipv4.tcp_rmem = 32768 436600 873200
net.ipv4.tcp_mem = 94500000 91500000 92700000
net.ipv4.tcp_max_orphans = 3276800
EOF
--生效
sysctl -p
limits.conf配置
--备份
cp /etc/security/limits.conf /etc/security/limits.conf_bak_20240119
--添加以下内容
cat >> /etc/security/limits.conf << "EOF"
#add by mysql
* soft nproc 65536
* hard nproc 65536
* soft nofile 65536
* hard nofile 65536
* soft stack 10240
* hard stack 32768
* soft core unlimited
* hard core unlimited
EOF
防火墙配置
默认防火墙是关闭状态
sudo ufw disable #禁用
如果启用防火墙需进行如下配置:
如果数据库端口和ssh端口不是3306和22,需视情况更改
sudo ufw enable #开启防火墙
sudo ufw allow 3306/tcp #仅tcp
sudo ufw allow 22/tcp #仅tcp
selinux配置
Ubuntu 默认未安装SELinux,省略设置。
root@HKSZF-ZW-172-19-146-175:/etc/selinux# getenforce
Command 'getenforce' not found, but can be installed with:
apt install selinux-utils
安装依赖包
如果不安装,迁移结束启动数据库会报:error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
apt-cache search libaio
apt-get install libaio1
创建用户
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
创建目录
su - root
mkdir -p /mysqldb
停止数据库(源库)
--查看源库进程,确定安装目录和配置文件
[root@localhost log8]# ps -ef | grep mysql
mysql 2232 1 9 11:19 ? 00:00:07 /mysqldb/mysql8/bin/mysqld --defaults-file=/mysqldb/my8.cnf
配置文件位置:/mysqldb/my8.cnf
--查看安装目录和数据目录位置
[root@localhost ~]# cat /mysqldb/my8.cnf | grep basedir
basedir=/mysqldb/mysql8 #mysql安装根目录
[root@localhost ~]# cat /mysqldb/my8.cnf | grep datadir
datadir=/mysqldb/data8 #mysql数据文件所在目录
--停止源数据库
systemctl stop mysqld
systemctl disable mysqld
systemctl status mysqld
系统服务文件位置:/usr/lib/systemd/system/mysqld.service
文件传输(源库到目标库)
文件传输包含以下文件:
- 安装目录
- 数据目录
- 配置文件
- 系统服务文件
我这儿是采用tar包二进制安装到了一个目录,如果目录是分开的请注意分开传输
--含安装目录+数据目录+配置文件传输
scp -r /mysqldb root@192.168.40.190:/
--系统服务文件传输
scp /usr/lib/systemd/system/mysqld.service root@192.168.40.190:/lib/systemd/system/
权限配置(新库)
chown -R mysql:mysql /mysqldb
chmod -R 755 /mysqldb
系统服务文件配置
--配置系统服务链接
ln -s /lib/systemd/system/mysqld.service /etc/systemd/system/mysqld.service
chmod +x /lib/systemd/system/mysqld.service
如果源库目录和新库目录一致,无需更改系统服务文件里的安装位置和配置文件位置,不然需要更改系统服务文件里的安装位置和配置文件位置即ExecStart=/mysqldb/mysql8/bin/mysqld --defaults-file=/mysqldb/my8.cnf
root@ubuntu:~# cat /etc/systemd/system/mysqld.service
[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
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/mysqldb/mysql8/bin/mysqld --defaults-file=/mysqldb/my8.cnf
LimitNOFILE=65536
LimitNPROC=65536
启动数据库(目标库)
--启动数据库(目标库)
systemctl start mysqld
systemctl status mysqld
--配置数据库开机自启
systemctl enable mysqld
配置环境变量
su - root
--备份源环境变量
cp .bashrc .bashrc_bak_20240119
--更改环境变量文件
vi .bashrc
末尾增加
export PATH=$PATH:/mysqldb/mysql8/bin
配置sock文件软链接
--查找sock文件位置
root@ubuntu:~# cat /mysqldb/my8.cnf | grep mysql.sock
socket = /mysqldb/mysql.sock
socket = /mysqldb/mysql.sock
socket = /mysqldb/mysql.sock
root@ubuntu:~# ls -l /mysqldb/mysql.sock
-rwxrwxrwx 1 mysql mysql 0 Jan 19 11:45 /mysqldb/mysql.sock
--配置软链接,不然登录提示Command 'mysql' not found
root@ubuntu:~# ln -s /mysqldb/mysql.sock /tmp/mysql.sock
语法:ln -s 源文件位置 软链接位置
注意:源文件位置:必须使用绝对路径不然无效
登录数据库
配置环境变量后新开一窗口登录数据库。
root@ubuntu:/mysqldb# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.35 MySQL Community Server - GPL
Copyright (c) 2000, 2023, 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>
迁移成功。
问题处理
启库失败error while loading shared libraries: libaio.so.1
问题描述
root@ubuntu:~# systemctl status mysqld
Jan 19 11:42:23 ubuntu mysqld[1805]: /mysqldb/mysql8/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
解决办法
安装依赖包,注意centos下是安装libaio,Ubuntu下是安装libaio1。
apt-cache search libaio
apt-get install libaio1
安装后启库成功。
登录数据库提示Command 'mysql' not found
问题描述
迁移结束后,服务运行正常,但是登录提示Command 'mysql' not found, but can be installed with:
root@ubuntu:~# mysql -uroot -p
Command 'mysql' not found, but can be installed with:
apt install mysql-client-core-5.7
apt install mariadb-client-core-10.1
千万不要被提示误导进行安装mysql-client-core-5.7 和mariadb-client-core-10.1
解决办法
配置环境变量
su - root
--备份源环境变量
cp .bashrc .bashrc_bak_20240119
--更改环境变量文件
vi .bashrc
末尾增加
export PATH=$PATH:/mysqldb/mysql8/bin
配置环境变量后,新开一窗口登录即可成功登录
参考链接:
启库报错链接:https://www.cnblogs.com/hufulinblog/p/10124001.html