MySQL切换服务器数据迁移记录

老服务器性能不足,计划迁移数据至新服务器

一、查询 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
相关推荐
我是苏苏4 小时前
C#基础:Winform桌面开发中自定义组件UI、属性及事件
服务器·数据库·c#
http阿拉丁神猫4 小时前
ansible脚本解读
服务器·ansible·apache
KaMeidebaby4 小时前
卡梅德生物技术快报|Fab 抗体文库构建标准化实验流程与数据复盘
服务器·前端·数据库·人工智能·算法
小船跨境4 小时前
演唱会自动化抢票如何提高成功率?票务住宅IP与配置指南
运维·服务器
想唱rap4 小时前
IO多路转接之epoll
linux·运维·服务器·数据库·网络协议·算法·http
舰长1154 小时前
polkit服务没起来,导致防火墙命令卡住
linux·运维·服务器
芊&星4 小时前
靶机应急 | 知攻善防----Linux
linux·运维·服务器·安全
Agent手记4 小时前
生产环节费用智能管控与超支预警方案:基于AGI智能体的精细化治理实践
运维·服务器·人工智能·ai·agi
仍然.4 小时前
传输层协议TCP
服务器·网络协议·tcp/ip