mysql如何进行冷备份_mysql离线备份方法

1次阅读

冷备份必须停止mysqld服务以保证数据一致性,本质是直接复制innodb(ibdata1、ib_logfile*、.ibd等)和myisam(.myd/.myi/.frm)物理文件,操作快但需注意全局文件完整性、权限恢复及innodb文件依赖。

mysql如何进行冷备份_mysql离线备份方法

MySQL 冷备份必须停止 mysqld 服务,否则无法保证数据文件一致性——这是最常被忽略的前提,直接导致备份无效。

冷备份的本质是复制物理文件

MySQL 的 InnoDB 表数据实际存储在 ibdata1ib_logfile0、表空间文件(如 db_name/tbl_name.ibd)以及 mysql 系统库的 ibdata1 和 frm 文件中。MyISAM 则依赖 .MYD + .MYI + .frm 三件套。冷备份就是把这些文件原样拷走,不经过 SQL 层,也不触发任何日志刷盘逻辑。

所以它快、简单、恢复也快,但代价是服务中断。常见误操作包括:

  • 只复制 /var/lib/mysql/db_name/ 下的表文件,漏掉全局文件(ibdata1ib_logfile*mysql/ 目录)
  • 没停服务就 cp,结果 ibdata1 处于未刷盘状态,恢复后 InnoDB 拒绝启动并报错 InnoDB: database page corruption on disk
  • 用 rsync 不加 --archive --checksum,或复制过程中磁盘满、权限丢失

标准冷备份操作步骤(linux + 默认 datadir)

确认 MySQL 已完全停止(systemctl is-active mysql 返回 inactive,且 ps aux | grep mysqld 无残留进程)后执行:

  • 记录当前版本与配置:mysqld --versionmysqld --verbose --help | grep "datadir|socket"
  • 确认数据目录位置:grep "datadir" /etc/my.cnfmysql -e "SHOW VARIABLES LIKE 'datadir';"(仅限启动时查,冷备前不能连)
  • 打包全部内容(含隐藏文件):tar -czf /backup/mysql_$(date +%F).tar.gz -C /var/lib/ mysql/(注意末尾斜杠,确保打包的是目录内容而非目录本身)
  • 校验压缩包完整性:tar -tzf /backup/mysql_*.tar.gz | head -20,再比对文件数:find /var/lib/mysql -type f | wc -l vs tar -tzf /backup/mysql_*.tar.gz | wc -l

恢复时最容易出问题的三个点

冷备份恢复不是简单解压就能用,InnoDB 对文件状态极其敏感:

  • 目标机器 MySQL 必须完全停止,且 datadir 目录下原有文件需先清空(rm -rf /var/lib/mysql/*),不能覆盖式解压
  • 解压后必须严格保持原权限:chown -R mysql:mysql /var/lib/mysql,否则启动失败报错 Can't start server: Bind on TCP/IP port 或更隐蔽的 table 'mysql.plugin' doesn't exist
  • 若源库启用了 innodb_file_per_table=OFF,所有表共享 ibdata1,则必须整份还原;哪怕只缺一个 .ibd 文件,InnoDB 启动时也会拒绝加载该表,且不会提示具体缺失项

冷备份看似简单,真正可靠的实践取决于对 InnoDB 存储引擎底层文件依赖关系的理解——比如 ib_logfile* 虽然可删,但删了会导致崩溃恢复失败;mysql.sockpid 文件不用备份,但 auto.cnf(含 server-uuid)必须保留,否则主从复制或 GTID 会紊乱。

text=ZqhQzanResources