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
相关推荐
唐青枫2 天前
MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
小满8782 天前
5.Mysql事务隔离级别与锁机制
mysql
元Y亨H3 天前
技术笔记:MySQL 字符集排序规则与大小写敏感性问题解决方案
mysql
这个DBA有点耶4 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵4 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
SamDeepThinking4 天前
一条UPDATE语句在MySQL 8.0中到底加了几把锁?
后端·mysql·程序员
李白客6 天前
KES新版MySQL兼容能力再升级意味着什么?
mysql·国产数据库
ClouGence6 天前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因
数据库·后端·oracle
Jim6008 天前
【吃透 MySQL InnoDB连载】第 1 章・解密线上数据库高频故障
mysql