老服务器性能不足,计划迁移数据至新服务器
一、查询 MySQL 数据库 / 表数据量大小
1、查询所有数据库的总大小
sql
SELECT
CONCAT(ROUND(SUM(data_length + index_length) / 1024 / 1024, 2), ' MB') AS total_database_size,
CONCAT(ROUND(SUM(data_length + index_length) / 1024 / 1024 / 1024, 2), ' GB') AS total_database_size_gb
FROM information_schema.TABLES;
2、查询单个数据库的大小
把 your_database 替换成你的库名:
sql
SELECT
table_schema AS database_name,
CONCAT(ROUND(SUM(data_length + index_length) / 1024 / 1024, 2), ' MB') AS database_size
FROM information_schema.TABLES
WHERE table_schema = 'your_database'
GROUP BY table_schema;
3、查询某个库下所有表的大小(按大小排序)
sql
SELECT
table_name AS 表名,
CONCAT(ROUND(data_length / 1024 / 1024, 2), ' MB') AS 数据大小,
CONCAT(ROUND(index_length / 1024 / 1024, 2), ' MB') AS 索引大小,
CONCAT(ROUND((data_length + index_length) / 1024 / 1024, 2), ' MB') AS 总大小,
table_rows AS 行数
FROM information_schema.TABLES
WHERE table_schema = 'your_database' -- 替换成你的库名
ORDER BY (data_length + index_length) DESC;
4、查询所有数据库的大小排名
sql
SELECT
table_schema AS database_name,
CONCAT(ROUND(SUM(data_length + index_length) / 1024 / 1024, 2), ' MB') AS total_size
FROM information_schema.TABLES
GROUP BY table_schema
ORDER BY SUM(data_length + index_length) DESC;
字段说明
data_length:数据文件大小
index_length:索引文件大小
table_rows:表行数(近似值)
总大小 = 数据大小 + 索引大小
二、备份恢复
1.本地备份恢复
1.1 MySQL 全库导出语句(备份)
sql
mysqldump -u用户名 -p 数据库名 > 导出文件路径.sql
1.2 MySQL 全库导入语句(恢复)
sql
mysql -u用户名 -p 目标数据库名 < 备份文件路径.sql
2.带编码、防乱码的完整版导出 / 导入
2.1 导出(不乱码、包含结构 + 数据)
sql
mysqldump -u用户名 -p --default-character-set=utf8mb4 数据库名 > 备份.sql
2.2 导入
sql
mysql -u用户名 -p --default-character-set=utf8mb4 数据库名 < 备份.sql
3.所有数据库备份恢复(整台 MySQL)
3.1 导出
sql
mysqldump -u用户名 -p --all-databases > all_databases.sql
3.2导入全部数据库
sql
mysql -u用户名 -p < all_databases.sql
4.直接导出到另一台 Linux 服务器
适用场景:
你现在在 服务器 A,要把 MySQL 备份直接发到 服务器 B
4.1 导出
sql
mysqldump -uroot -p mydb | ssh root@192.168.1.100 "cat > /backup/mydb_backup.sql"
带压缩的版本(大数据库必备)
数据库大的时候一定要压缩,速度快 10 倍以上:
sql
mysqldump -u用户名 -p 数据库名 | gzip | ssh 用户名@另一台IP "cat > /路径/备份.sql.gz"
或者
sql
mysqldump -uroot -pAAAAA --all-databases --single-transaction --quick --lock-tables=false --default-character-set=utf8mb4 | gzip | ssh root@10.10.100.42 "cat > /opt/all.sql.gz"
解压命令(备用):
sql
gzip -d 备份文件.sql.gz
5 xtrabackup 物理备份迁移
5.1 安装 xtrabackup
powershell
1.先安装 Percona 源(必须)
yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
2.启用 xtrabackup 80 仓库
percona-release enable-only tools release
3.安装 xtrabackup 8.0(支持 MySQL 8.0)
yum install -y percona-xtrabackup-80
4.验证是否安装成功
xtrabackup --version
出现版本信息 = 安装成功
5.2 源库 MySQL8.0.20 热备(不停业务)
powershell
# 全量备份到/opt/mysql_backup
xtrabackup --user=root --password=VQaRUYH_o5 \
--backup --target-dir=/opt/mysql_backup
# 备份完成必须执行:事务日志预提交(恢复必备)
xtrabackup --prepare --target-dir=/opt/mysql_backup
5.3 打包传到新服务器
powershell
# 压缩备份
tar -zcf mysql80_bak.tar.gz /opt/mysql_backup
# 传到新MySQL机器
scp mysql80_bak.tar.gz root@10.10.100.42:/opt/
5.4 目标机器 MySQL8.0.45 恢复步骤
powershell
1. 停止 mysql
systemctl stop mysqld
2.清空原有数据目录(重要!提前确认无有用数据)
rm -rf /var/lib/mysql/*
3.解压备份包
tar -zxf /opt/mysql80_bak.tar.gz -C /opt/
4.执行数据恢复
xtrabackup --copy-back --target-dir=/opt/mysql_backup
5.修复权限
chown -R mysql:mysql /var/lib/mysql
chmod -R 700 /var/lib/mysql
6.启动 MySQL
systemctl start mysqld
systemctl enable mysqld
5.5 关键注意点(8.0.20→8.0.45 必看)
大版本一致都是 8.0,物理恢复完全兼容,权限、库表、存储过程、事件全部原样迁移
恢复后root 密码、用户账号全部和原库一模一样,不用重新建用户
迁移完成建议执行一次升级适配:
sql
mysql_upgrade -uroot -pAAAA