凌云的博客

行胜于言

MySQL 物理备份恢复(一)

分类:MySQL| 发布时间:2019-11-07 16:11:00


MySQL 物理备份可以通过 Percona 的 xtrabackup 来进行。 本文主要描述如何对 MySQL 进行物理全备与恢复。

安装

可以从 源码编译 xtrabackup, 如果你的系统是 Ubuntu 或者 Debian 也可以使用 Percona 官方 提供的 deb 包。

物理全备

通过 Percona 的 xtrabackup 可以实现对 MySQL 进行物理热备份,最大限度减少备份操作对业务系统的影响。

在 MySQL 所在主机运行以下命令:

$ xtrabackup \
    --password=123456 \
    --user="root" \
    --backup \
    --datadir=/var/lib/mysql/ \
    --socket=/var/run/mysqld/mysqld.sock \
    --target-dir=/data/mysqlbackup/base

这条命令会将 MySQL 备份到 /data/mysqlbackup/base 目录下。

  • --password MySQL 的密码
  • --user 用户名
  • --backup 表示进行备份
  • --datadir MySQL 的数据目录,如果不指定这个参数, xtrabackup 会从 /etc/my.cnf /etc/mysql/my.cnf 等预设的路径寻找 MySQL 的配置文件,并查找 MySQL 的 datadir 选项
  • --socket 表示通过这个 *nix socket 文件和 MySQL 通讯,也可以使用 --host 和 --port 选项以 TCP 的形式和 MySQL 通讯
  • --target-dir 表示将 MySQL 备份到这个目录

这个命令的执行过程中,会将执行过程输出到标准错误中。 成功执行后,会有如下的输出:

MySQL binlog position: filename 'mysql-bin.000004', position '777', GTID of the last change 'd01d92c6-399c-11e9-88c1-00163e02ae86:1-4'
191107 15:36:31 [00] Writing /data/mysqlbackup/base/backup-my.cnf
191107 15:36:31 [00]        ...done
191107 15:36:31 [00] Writing /data/mysqlbackup/base/xtrabackup_info
191107 15:36:31 [00]        ...done
xtrabackup: Transaction log of lsn (1308177312) to (1308177321) was copied.
191107 15:36:31 completed OK!

我不想在命令行中使用密码,该怎么办?

和使用 mysqldump 类似,你需要创建一个含有 MySQL 密码的配置文件,然后使用 --defaults-extra-file 选项指定这个文件(去掉 --password 选项)。 文件内容如下:

[xtrabackup]
password=123456

我想将备份数据打包成一个文件,以方便保存,该如何做?

如下:

$ xtrabackup \
    --password=123456 \
    --user="root" \
    --backup \
    --datadir=/var/lib/mysql/ \
    --socket=/var/run/mysqld/mysqld.sock \
    --stream=xbstream > full.xbstream
  • --stream 可选的值为 tar 或者 xbstream

这个命令会将备份集以 xbstream 格式输出到标准输出中。 这个格式的备份集可以使用 percona-xtrabackup 包自带的 xbstream 命令来进行解包:

$ mkdir full
$ xbstream -x -C full <full.xbstream

恢复

由于 xtrabackup 备份出来的 MySQL 数据并不是一致的,在将其用于恢复前需要先将其恢复到一致状态:

$ xtrabackup --prepare --target-dir=/data/mysqlbackup/base

之后就可以将备份集的数据复制回 MySQL 的数据目录:

$ xtrabackup --copy-back --target-dir=/data/mysqlbackup/base --datadir=/var/lib/mysql

在进行这一步前需要确保 MySQL 服务进程已经停止,并且确保 datadir 的目录是空的

如果你不需要保留备份集也可以使用 --move-back 参数来代替 --copy-back。

或者你可 rsync 等其他命令进行数据的复制操作,比如:

$ rsync -avrP /data/mysqlbackup/base/ /var/lib/mysql/

复制完成后,你需要修改数据文件的所有者

$ chown -R mysql:mysql /var/lib/mysql

以确保 MySQL 进程有正确的权限对其进行访问。 现在,你可以启动 MySQL 并且验证恢复是否正常了。

参考