数据库备份

本贴最后更新于 561 天前,其中的信息可能已经时过境迁

数据库备份共分为两个脚本,一个全量备份,一个增量备份

增量备份基于 binlog,确保数据库开启了 binlog

mysql 终端中输入 SHOW variables LIKE 'log_%' ​​ 进行查看

image

执行增量备份前,需要先执行一次全量备份,整理备份是在全量备份基础上进行增量备份的

共包含一个配置文件 mysql.conf,和三个脚本文件 (一个全量脚本,两个增量脚本)

  • Mysql_FullBak.sh 全量备份脚本, 每周一次全量备份
  • Mysql-DailyBak.sh 增量备份脚本, 建议每天一次增量 (备份 binlog 文件,用 mysqlbinlog 命令恢复,推荐使用)
  • Mysql-DailySql.sh 增量备份脚本,(用 binlog 生成 sql, 不推荐使用) (在 Mysql-DailyBak.sh 脚本上增加了生成 sql 功能)

image

配置文件 mysql.conf

BinDir 目录 上面 SHOW variables LIKE 'log_%'​可以查看文件夹位置

MYSQL_USER="root"
MYSQL_PASSWORD="123456"
MYSQL_HOST="localhost"
MYSQL_DATABASE="test"

# 全量备份保存的地址, 增量备份保存在 BakDir/daily 文件下, 文件夹会自动创建
BakDir=/backup
# 脚本执行的日志
LogFile=$BakDir/bak.log

# mysql的数据目录, binlog日志的位置, 其中 包含mysql-bin.index  文件 mysql终端中可以使用 `SHOW variables LIKE 'log_%'`可以查看文件位置
BinDir=/www/server/data

全量备份

Mysql_FullBak.sh

主要使用 mysqldump 进行全量备份,确保 mysqldump 命令好用, 如果命令不存在,找到 mysqldump 的安装位置,则 创建软链接

ln -s /usr/local/mysql/bin/mysqldump  /usr/bin  # /usr/local/mysql/bin/mysqldump 为mysqldump 的位置 根据安装位置自己进行修改

给 全量备份脚本 执行权限 chmod +x Mysql-FullBak.sh​, 然后执行,全量备份的 sql 保存在 mysql.conf 配置中 BakDir 的文件夹下

执行结果

image

  • bak.log 记录 shell 执行的日志文件
  • 20230421.sql.tgz 用期进行命名的,全量备份的 sql 压缩文件
  • daily 文件夹,用于存放 增量备份,binlog 文件,增量备份,需要这个目录 (每次全量备份后,会清空该文件夹)

增量备份

主要 mysqlbinlogmysqladmin 命令, 确保两个命令好用,如果命令不存在,找到 mysqladmin 和 mysqlbinlog 的安装位置, 则 创建软连接

ln -s /usr/local/mysql/bin/mysqladmin  /usr/bin  # /usr/local/mysql/bin/mysqladmin 为mysqladmin 的位置 根据安装位置自己进行修改
ln -s /usr/local/mysql/bin/mysqlbinlog  /usr/bin  # /usr/local/mysql/bin/mysqlbinlog 为mysqlbinlog 的位置 根据安装位置自己进行修改

分两个脚本,使用其中一个就行

  • Mysql-DailyBak.sh 推荐使用
  • Mysql-DailySql.sh 在 Mysql-DailyBak.sh 基础上增加了 根据 binlog 生成 sql 的功能

给 增量备份脚本 执行权限 chmod +x Mysql-DailyBak.sh​, 然后执行,增量备份的二进制 binlog 日志文件, 保存在 mysql.conf 配置中 BakDir 的文件夹下 daily 文件夹下

增量备份脚本说明

每次增量备份,会通过 mysqladmin 刷新生成最新的 binlog,然后我们复制一份到 backup/daily 文件夹下面

image

数据恢复

全量备份恢复

  • 解压全量备份 sql
tar -zxvf 日期.sql.tgz

# 恢复全备数据, 或者在 mysql 终端中 用 source
mysql -uroot -p < 日期.sql
  • 查看全量备份

MASTER_LOG_POS

由图可知,这是全备时刻的 binlog 文件位置,即 mysql-bin.000064 的 154 行,因此在该文件之前的 binlog 文件中的数据都已经包含在这个全备的 sql 文件中。

image

增量备份 恢复

二选一

  • 方法一:使用 mysqlbinlog 进行恢复

后面 使用 mysqlbinlog 进行恢复

test 为数据库名

root 用户名

123456 数据库密码

#cd daily
#mysqlbinlog --start-position=154 --database=test mysql-bin.000064 | mysql -uroot -p123456

master-bin.000064 后的 binlog 日志

mysqlbinlog master-bin.000065 | mysql -uroot -p123456
mysqlbinlog master-bin.000066 | mysql -uroot -p123456
mysqlbinlog master-bin.000067 | mysql -uroot -p123456
.....
.....

mysqlbinlog 还有很多参数,可以很灵活的进行增量恢复

--常用选项:
--start-datetime=name  #binlog文件读取的起始时间点,可接受datetime和timestamp类型,格式2004-12-25 11:25:56
--stop-datetime=name   #binlog文件的结束的时间点。
--start-position=      #读取binlog文件的位置信息
--stop-position=       #binlog文件的结束的位置信息
  • 方法二:使用 sql 进行恢复

    使用 Mysql-DailySql.sh 才会有这个功能, 执行后会在 backup/daily 目录下生成 increment.sql 的文件

image

数据恢复增量
# 恢复增量数据, 或者在 mysql 终端中 用 source
mysql -uroot -p < increment.sql

  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    337 引用 • 705 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...