痛点直击:MySQL数据迁移是每个DBA都会遇到的挑战。无论是硬盘空间不足、升级服务器还是容灾备份,传统方法往往耗时耗力且存在风险。
为什么需要迁移MySQL数据?
-
存储空间不足:当默认的/var/lib/mysql目录所在分区空间告急时
-
性能调整:将数据库放到SSD或独立存储设备上提高IO性能
-
容灾备份:实现主从复制或异地多活部署
-
程序升级:迁移至更高版本CentOS或更换服务器硬件时保留数据完整性
-
业务拆分:将单个服务器上的多个项目的MySQL实例隔离到不同物理机上
迁移前必备准备工作
⚠️ 警告:直接操作生产环境极易导致数据损失!说起来,请严格按照下面步骤操作!⚠️
1. 必须全量备份源数据库!其实,
2. 停止MySQL服务确保一致性!
bash
systemctl stop mysqld
⚠️ 如果此时有连接正在执行事务,可能导致数据不一致!可以考虑低峰期操作,
3. 验证原始目录可读写状态!按理说,
bash
df -h /var/lib/mysql/
ls -la /var/lib/mysql/
如果发现以下任一情况。需先修复:
✅ 分区已满
✅ MySQL账号权限异常
✅ inode资源耗尽
💡 小贴士:可以通过mount命令检查当前文件程序类型和挂载点!bash
mount | grep mysql
📌 注意事项:
在开始任何拷贝操作前。请确认目标磁盘有足够剩余空间
原始目录默认为/var/lib/mysql/,如已自定义则以实际为准!
两种主流迁移方式对比及选择教程
| 方式名称 |
适用场景 |
停机时间 |
复杂度 |
风险等级 |
典型使用场景 |
| 物理拷贝法 |
同版本同网站高性能场景首选!,!,!, |
-
: 高并发OLTP程序升级磁盘容量时使用!,!,⭐⭐⭐⭐⭐
-
: 源端与目标端均为相同CentOS版本+相同MySQL大版本时使用!,!,!,
-
: 对停机时间极度敏感且允许短暂中断的金融交易类应用!,!,!
-
: 大型电商节日促销后处理订单库增长需求!,!,!
-
: 安全合规要求将程序磁盘与数分离时使用!,!
-
: 不适合跨大版本 或架构迁移场景!
-
: 需预留至少双倍源端datadir大小的临时存储空间!
-
: InnoDB表空间结构复杂可能导致部分特殊边界case失败!话说回来,
🔹 说明一下: 此方法理论上支持秒级切换。但实际生产中建议预留至少几分钟缓冲!🔹 说明一下: 建议搭配LVM快照技术提高安全性!🔹 说明一下: 此方法无法处理DDL变更或触发器等元信息差异问题!
| 逻辑 |
跨网站/跨版本灵活方案!, |
-
: 不同CPU架构,不同Linux发行版。不同MySQL大版本
🔹 注意 : 大规模库表需调优参数
🔹 注意 : 建议禁用外键约束
🔹 注意 : 对于TB级以上库名考虑分批处理并启用压缩输出
物理拷贝法详细步骤图解
危险!: 本章节所有命令必须以root权限执行!否则可能引发权限漏洞, 警告!: 在任何阶段中断操作都可能导致不可恢复错误! 关键提示!&nbps: 建议使用tmux/screen确保远程连接稳定!
现在我们来看具体实施步骤:
获取当前datadir配置值
grep datadir /etc/my.cnf
systemctl stop mysqld.service
umount -l /dev/mapper/vg_mysql-lv_mysql
lvcreate -n lv_mysql_new -L +5T vg_data
mkdir -p /mnt/mysql_new && chmod a+rxw /mnt/mysql_new
mount /dev/mapper/vg_data-lv_mysql_new /mnt/mysql_new
rsync -avzhP --delete \
--exclude={ib_logfile*。performance_schema,*test*,mysql_innodb*} \
/var/lib/mysql/* \
/mnt/mysql_new/
cd /var/lib/mysql && md5sum * | tee original.md5sums.txt && cd -
cd /mnt/mysql_new && md5sum * | diff ../original.md5sums.txt -
sed -i '/^\/{n;s|^.*datadir.*$|datadir=/mnt/mysql_new|}' /etc/my.cnf.d/server.cnf
mysqld_safe --user=mysql --basedir=/usr/local/mysql &
sleep 60 && mysqladmin ping || echo "FAILED!" && exit 99;
关键参数调优教程
| 参数名 |
推荐值 |
作用 |
| innodbiocapacity_max |
max |
平滑IO负载 |
| innodbbufferpool_size |
RAM*70% |
内存映射调整 |
| innodblogfile_size |
min |
日志段落调整 |
| tableopencache_instances |
CPU主要数*4 |
高并发预加载 |
| tmptablesize/querycachesize |
min |
查询缓存控制 |
性能基准测试工具集合:
bash=
yum install sysbench benchmarks-tools perf-trace ipperf stress-ng blktrace nmon atop htop iotop dstat collectl ifstat smem netperf sar vmstat mpstat slabtop lsof strace tcpdump wireshark bmon ethtool net-snmp-perl nload nethogs pstack pt-table-checksum pt-table-sync pt-online-schema-change pt-multiquery pt-summary mytop slowquery-analyzer mysqlreport mtop mariadb-csvdump mha-manager mha-node maatkit percona-toolkit xapian-core xapian-bindings libxapian-devel perl-XSLoader perl-DBI perl-DBD-MySQL perl-TermReadKey libaio-devel openssl-devel ncurses-devel cmake boost boost-devel readline readline-devel zlib zlib-devel bzip2 bzip2-devel python python-pip python-setuptools git mercurial subversion rpm-build patch gcc gcc-c++ make autoconf automake libtool flex bison pkgconfig libevent libevent-devel jansson jansson-devel doxygen graphviz gnuplot pcre pcre-devel socat lrzsz rsync curl wget bc procps psmisc expect vim-enhanced unzip unrar zip tar gzip pigz pbzip pbunzip pigz parallel findutils coreutils which sed awk grep dos2unix util-linux file shadow-utils crontabs anacron at cronie cronie-anacron dbus dbus-libs logrotate lvm lvm-static parted efi-bin efi-systemd grubby kexec-tools acpid acpid-client powerdevil polkit network-scripts bind-utils traceroute tcpdump tcpwrappers tshark tshark-common wireshark-gnome wireshartk dumpcap sshpass sshfs sshfs-fuse samba samba-client samba-common samba-winbind-clients winbind nfs-utils rpcbind avahi avahi-daemon avahi-dnsconfd avahi-discover-gnome avahi-tools ntp ntpdate chrony ntpd ntpd-client postfix mailx procmail sendmail sendmail-cfg mailcap postgrey spamassassin spamassassin-updater clamav clamav-update clamd freshclam fprocmail proftpd proftpd-modauthpgsql proftpd-modauthmysql proftpd-modauthldap dovecot dovecot-auth-sqlite dovecot-auth-mysql dovecot-auth-pgsql cyrus-imapd cyrus-imapd-pop cyrus-imapd-mupdate cyrus-imapd-proxy courier courier-authdaemon courier-authlib courier-authlib-mysql courier-authlib-postgresql exim exim-sa exim-stats maildrop maildrop-filter opendkim opendkim-tools opendkim-proctools opendmarc opendmarc-cli rspamd redis memcached varnish varnish-ncache nginx apache httpd modssl modsecurity modbwlimited modfastcgi modfcgid fcgiwrap suphp suexec php php-cli php-fpm php-common php-gd php-json php-mbstring php-mysqlnd php-opcache php-pdo php-xmlrpc php-xmlwriter lighttpd lighttpd-fastcgi lighttpd-modaccess lighttpd-modaccesslog lighttpd-modalias lighttpd-modauth lighttpd-modcgi lighttpd-modcompress lighttpd-modenv lighttpd-modexpire lighttfdodmodextforward lighttdodmodfastcgi lighthttpodmodgicache lignthttpodmodlogconfig lihthttpodmodproxy lihthttpodmodproxyscgi lihthttpodmodproxyfastci lihthttpodmodscp lihthttpodmodsimplevhost lignthttpodmodstatus lihthttpod_
常见问题解答
Q:在生产环境中是否可以不停机完成?A:
A:理论上支持但强烈不建议!因为:
① 数据库状态无法完全冻结
② binlog位置偏移计算风险较高
③ 中途失败恢复成本剧增
Q:A:
A:执行以下检查命令:`
uname -m;cat /etc/*release;rpm -qa \| grep mysql-server;`
Q:大型InnoDB表如何减少拷贝时间?A:
A:三种加速手段:`
① transportable tablespaces
② percona-xtradbackup热备份工具套件
③ LVM快照克隆技术`
Q:如何应对半路网络中断?
A:rsync的--partial参数可续传未完成文件!`
Q:SELinux阻止访问怎么办?其实,`A:_`
A:`setsebool_-P allow_mysql_home_dir on
setsebool_-P httpd_cannetworkconnect_db on`
|
|