Docker-compose搭建mysql开启binlog日志

2022-07-28 08:19:39

docker-compose.yml 如下:

#版本号
version: "3"
services:
#主数据库
  mysql-master:
#镜像
    image: mysql:5.7
    restart: always
#名称(可以为空)
    hostname: mysql-master
#容器名称
    container_name: mysql_master
#端口号
    ports:
      - 3306:3306
#环境变量
    environment:
      MYSQL_ROOT_PASSWORD: root
      TZ: Asia/Shanghai
#挂载文件
    volumes:
      - ./mysql/data:/var/lib/mysql
    command:
#id唯一
      --server_id=100
      --log-bin=mysql-bin
      --sync_binlog=1
      --binlog-ignore-db=mysql
      --binlog_format=mixed
      --expire_logs_days=7
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

安装成功后可以在挂在目录下看到如下文件:

或者可以通过执行语句来确认一下binlog的是否开启:

mysql> SHOW VARIABLES LIKE '%log_bin%';
+---------------------------------+--------------------------------+
| Variable_name                   | Value                          |
+---------------------------------+--------------------------------+
| log_bin                         | ON                             |
| log_bin_basename                | /var/lib/mysql/mysql-bin       |
| log_bin_index                   | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF                            |
| log_bin_use_v1_row_events       | OFF                            |
| sql_log_bin                     | ON                             |
+---------------------------------+--------------------------------+
6 rows in set (0.01 sec)

为了方便测试,我们可以先将log清空一下,此时只剩下一个日志文件如下:

RESET MASTER; -- 清空语句

 这时我们创建一个库binlogtest,并创建一个表table_01,并在表中插入一条数据如下:

 这是我们可以使用命令flush logs;用来生成一个新的日志文件mysql-bin.000002

 现在我们直接删库,如下可以看到库已被删除


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

准备恢复,执行语句:

// 先查看对应的mysql容器
[root@adobe1 data]# docker ps  
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
372953fef56a   mysql:5.7   "docker-entrypoint.s…"   32 minutes ago   Up 32 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql_master
// 进入容器
[root@adobe1 data]# docker exec -it 372953fef56a bash
// 进入日志目录
root@mysql-master:/# cd /var/lib/mysql 
root@mysql-master:/var/lib/mysql# ls
auto.cnf    client-cert.pem  ib_logfile1  mysql-bin.000001    private_key.pem  sys
binlogtest  client-key.pem   ibdata1	  mysql-bin.000002    public_key.pem
ca-key.pem  ib_buffer_pool   ibtmp1	  mysql-bin.index     server-cert.pem
ca.pem	    ib_logfile0      mysql	  performance_schema  server-key.pem
// 执行恢复语句
root@mysql-master:/var/lib/mysql# mysqlbinlog --no-defaults ./mysql-bin.000001 |mysql -uroot -p
Enter password: 
// 恢复完成
root@mysql-master:/var/lib/mysql#

 此时我们在此查看库以及数据有没有恢复:

 是不是很棒,当然也可以通过具体位置恢复或者具体时间恢复语句如下:

恢复指定位置数据
mysqlbinlog ‐‐no‐defaults ‐‐start‐position="408" ‐‐stop‐position="731"./mysql‐bin.000001
|mysql ‐uroot ‐p tuling (数据库)

恢复指定时间段数据
mysqlbinlog ‐‐no‐defaults ./mysql‐bin.000001 ‐‐stop‐date="2018‐03‐02 12:00:00" ‐‐start‐date="2019‐03‐02 11:55:00" | mysql ‐uroot ‐p test(数据库)

可以自行去试一下。

当然我们数据库内容可能很大,所以我们想要完善binlog的话,我们可以定时将我们的日志归档,便于后期恢复。主要控制权限,别被删库的家伙把binlog也删了,那耶稣来了也就不了你了。

  • 作者:AdobePeng
  • 原文链接:https://blog.csdn.net/AdobePeng/article/details/121563302
    更新时间:2022-07-28 08:19:39