1 场景介绍 {#heading-1}
binlog 是 MySQL 的二进制格式文件,会记录用户对数据库的更新信息,例如更改数据库表和更改内容的SQL语句都会记录到 binlog 里,但是对库表的查询不会记录。
DataEase 的 MySQL 默认情况下没有开启 binlog,开启 binlog 后,会记录用户对 DataEase 资源的新建、修改、删除等操作,如果用户希望恢复到某一时间点的状态,可通过数据库备份和 binlog 来完成。
2 添加 binlog 配置 {#heading-2}
在 DataEase 的安装目录的 MySQL 配置文件增加配置,开启 binlog
binlog 文件将保存在 MySQL 容器中的 /var/lib/mysql 目录,该目录在安装 DataEase 时已持久化到宿主机的 /opt/dataease/data/mysql 目录。
sed -i '2i\
server_id=110\\
log_bin=/var/lib/mysql/mysql-bin\\
binlog-format=mixed\\
sync-binlog=1\\
expire_logs_days=7\\
max_binlog_size=100m\\
binlog_cache_size=10m\\
max_binlog_cache_size=512m\\
binlog_stmt_cache_size=100m\\
`max_binlog_stmt_cache_size=100m\n' /opt/dataease/conf/my.cnf`
重启 mysql 容器
dectl restart mysql
3 增加数据库备份 {#heading-3}
编写备份脚本,增加全量备份设置,并定期运行备份脚本
vi /opt/backup-de.sh
#!/bin/bash
TIME=`date "+%Y_%m_%d-%H_%M_%S"`
BAK_DIR=/opt/bak
\[ ! -d $BAK_DIR \] \&\& mkdir $BAK_DIR
cd $BAK_DIR
mysqldump -uroot -pPassword123@mysql dataease \>\> $BAK_DIR/mysql-dataease_$TIME.bak.sql
mysqldump -uroot -pPassword123@mysql -ntd -R dataease \> $BAK_DIR/mysql-function_$TIME.bak.sql
delete history backup file
==========================
`find $BAK_DIR/ -mtime +7 -name "*.sql" -exec rm -rf {} ;`
给脚本赋执行权限
[root@dataease opt]# chmod +x /opt/backup-de.sh
创建执行计划
每天 凌晨 1 点执行备份任务
00 01 * /opt/backup-de.sh
4 binlog恢复 {#heading-4}
示例:将 DataEase 恢复到 2023年 5月 29日 15:00 的状态
# 将2023 年 5 月 29 日 凌晨 1 点的全量备份复制到 MySQL 容器目录中
"/opt/dataease/data/mysql" 为 MySQL 容器持久化目录
==========================================
cp /opt/bak/mysql-dataease_2023_05_29-01_00_00.bak.sql /opt/dataease/data/mysql
#登录 MySQL
docker exec -it mysql mysql -uroot -pPassword123@mysql
查看 binlog,确定最新的 binlog 文件
=========================
mysql\> show binary logs;
+------------------+-----------+
\| Log_name \| File_size \|
+------------------+-----------+
\| mysql-bin.000001 \| 49475562 \|
\| mysql-bin.000002 \| 8783 \|
\| mysql-bin.000003 \| 153284 \|
+------------------+-----------+
3 rows in set (0.01 sec)
mysql\> exit
先进行全量恢复,恢复 2023年 5月 29日 凌晨 1 点的备份
=================================
mysql -uroot -pPassword123@mysql \< /var/lib/mysql/mysql-dataease_2023_05_29-01_00_00.bak.sql
通过 binlog 恢复 2023年 5月 29日 凌晨 1 点到 15 点的数据
=========================================
`mysqlbinlog /var/lib/mysql/bin-log/mysql-bin.000003 --start-datetime="2023-05-29 01:00:00" --stop-datetime="2023-05-29 15:00:00" --database=dataease --skip-gtids | mysql -uroot -pPassword123@mysql`
以上操作,可实现恢复任意时间点的数据,如果在 DataEase 中做了误删除操作,可以通过 binlog 恢复至删除时间点前的数据状态,以实现恢复误删除的效果。