CentOS中MySQL8.0迁移data数据文件
文章目录
一. 准备工作
1. 清理binlog日志
PURGE binary LOGS BEFORE '2023-08-19 03:00:00';
- 详细说明见:MySQL安全删除binlog日志
- 如果没有这方面需求可忽略
2. 查看MySQL运行状态
- 主要目的是查看当前MySQL是使用什么命令启动的
service mysql status
或
service mysqld status
或
systemctl status mysql
或
systemctl status mysqld.service
3. 查询和关闭SELINUX
- SELINUX对文件权限和访问控制进行了更加严格的限制,这可能阻止一些应用程序的正常运行。为了避免MySQL无法读取数据导致迁移失败,选择关闭。
3.1 查询
[root@localhost log]# getenforce
Disabled
3.2 永久关闭
vim /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
3.3 重启系统
[root@localhost ~]# reboot
3.4 验证
[root@localhost log]# /usr/sbin/sestatus
SELinux status: disabled
[root@localhost log]# getenforce
Disabled
4. 查看当前MySQL data文件位置
- 在MySQlL中查询
SHOW VARIABLES
或
SHOW VARIABLES LIKE 'datadir';
或
SELECT @@datadir;
5. 查看MySQL data占用空间
[root@localhost data]# /home/mysqldata/data/
[root@localhost mysqldata]# du -sh ./*
269G ./data
702M ./log
6. 目录
- 当前目录 /home/mysqldata/data/
- 目标目录 /data/mysqldata/data/
- 创建目标目录
mkdir /data/mysqldata/ chown mysql:mysql mysqldata
二. 迁移
1. 关闭MySQL
-
关闭
service mysql stop
-
启动
可以测试关闭后在不改动情况下能不能启动成功
service mysql start
2. 转移数据
2.1 理论
-
转移数据(mv或cp原始数据库数据目录文件)
-
这里用的cp,为了安全考虑,直接复制一份,如果失败原始数据不会影响,可以快速回滚到之前的目录启动数据库
cp -a /home/mysqldata/data /data/mysqldata/
-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合; -d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录; -p:保留源文件或目录的属性; -R/r:递归处理,将指定目录下的所有文件与子目录一并处理; 可以cp命令参考CP说明。另说明mv命令能保留文件的所有属性和权限,尤其是selinux属性,但是不能快速回滚,这个自己权衡吧,看哪个合适。
2.2 脚本
-
由于MySQL data文件过大为了防止SSH超时关闭和等待,通过服务端定时执行脚本
-
执行完后一定要删除定时任务,不删除的后果很严重
########################################################## ## 建存脚本文件 #vi cp_mysqldata.sh #chmod 755 cp_mysqldata.sh ## 每天01:30自动执行脚本 #查询crontab状态 service crond start #crontab -e #30 01 * * * /root/cp_mysqldata.sh ## 建存放日志的文件 #vi cp_mysqldata.log #chmod 755 cp_mysqldata.log ########################################################## #!/bin/sh echo "======== 迁移MySQL date目录开始 ========" # 创建时间变量用于记录开始时间 time=$(date "+%Y-%m-%d %H:%M:%S") # 创建日志文件变量,用于记录执行日志 FILE=/root/cp_mysqldata.log echo "----------------------------------- 迁移MySQL date目录开始-----------------------------------">>${FILE} echo $time echo $time>>${FILE} cp -a /home/mysqldata/data /data/mysqldata/ if [ $? -eq 0 ]; then echo "迁移success">>${FILE} else echo "迁移fail">>${FILE} fi # 重新赋值时间变量用于记录结束时间 time=$(date "+%Y-%m-%d %H:%M:%S") echo $time echo $time>>${FILE} echo "======== 迁移MySQL date目录结束 ========" echo "----------------------------------- 迁移MySQL date目录结束-----------------------------------">>${FILE}
-
注意:执行完后一定要删除定时任务,不删除的后果很严重 +1
-
很严重+2,很严重+3,很严重+4
crontab -e
3. 修改新目录的权限
chown -R mysql:mysql mysqldata/data,-R逐级修改
三. 修改配置文件
1. /etc/my.cnf
1.1 备份
cp /etc/my.cnf /etc/my.cnf_bak
1.2 编辑配置文件
- vim /etc/my.cnf
- 修改如下几项( #为了安全起见,把原来的注释掉,然后重新加入一行,改成现在的目录,也会为了快速回滚。)
[mysqld]
# datadir=/home/mysqldata/data
datadir=/data/mysqldata/data
# 可以选择不修改
# log-bin=/home/mysqldata/log/mysql-bin
log-bin=/data/mysqldata/log/mysql-bin
2. /etc/init.d/mysql
- 也可能是/etc/init.d/mysqld
- 注意:准确的位置是/etc/rc.d/init.d/mysqld,由于这里这里有一个/etc/init.d到/etc/rc.d/init.d的映射,所以用上面的命令即可。
2.1 备份
cp /etc/init.d/mysql /etc/init.d/mysql_bak
2.1 编辑配置文件
- vim /etc/init.d/mysql
# datadir=/home/mysqldata/data
datadir=/data/mysqldata/data
四. 启动MySQL
- 启动
service mysql start
- 查看状态
service mysql status
五、可能会出现的问题
[root@dbserver data]# service mysql status
ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists
参考:https://blog.51cto.com/u_16175478/6598286
- 存在锁文件未能清理导致
- 删除锁文件即可
rm /var/lock/subsys/mysql