Docker下使用MySQL的binlog恢复数据

系统:CentOS 7

数据库:MySQL 5.7

Docker:19.03.13

一、拉取mysql镜像并启动

1、拉取镜像

docker pull mysql:5.7

镜像拉取好后查看一下

docker images

结果如下

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.7                 ae0658fdbad5        10 days ago         449MB

这说明镜像拉取好了

2、启动镜像

这里要挂载三目录,一个是配置文件my.cnf的,一个是存放数据的,一个是放置binlog日志的,所以先建立三个目录

mkdir -p /data/data-server/mysql/mysql_data
mkdir -p /data/data-server/mysql/mysql_bin
mkdir -p /data/data-server/mysql/mysql_cnf

这个时候使用-p来递归建立文件夹

配置my.cnf文件,这个文件放在/data/data-server/mysql/mysql_cnf目录下

[mysqld]
lower_case_table_names=1
max_connections=1000
server-id=1
log-bin=/var/lib/mysql-bin/mytest-bin
binlog_format=ROW
explicit_defaults_for_timestamp=1

这里简单说明一下

**ower_case_table_names:**表名称大小写敏感,设置为1表示区分大小写

**max_connections:**最大连接数

**explicit_defaults_for_timestamp:**这个表示当使用类型timestamp时是否操作更新,一般会关闭使用赋值为on1

server-id: 这个要注意,如果是集群是要求不重复的,在这里随便多少,但是必须要有才行

log-bin: 这个也要注意一下,这个是mysql服务器的存放binlog文件的目录,但是实际目录是倒数第二个,倒数第一个是日志的签字和日志索引的前缀;例如例子中实际目录是:/var/lib/mysql-bin/;前缀是mytest-bin

启动后可以看到目录文件:

# 使用命令 ls 可以看到
mytest-bin.000001  mytest-bin.index 

***binlog_format:***这里是配置binlog类型的,默认是row

这里有一个问题要知道,我现在配置的这个log-bin实际上是无法使用的,启动镜像时会报错的,查看docker日志的指令

docker logs [容器id]

这个时候会抛出发现不了mytest-bin.index索引的异常,原因是权限不够,这里先改一下my.cnf

log-bin=/var/lib/mysql/mysql-bin

这个时候就可以启动了

docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -v /data/data-server/mysql/mysql_data/:/var/lib/mysql/:rw -v /data/data-server/mysql/mysql_cnf:/etc/mysql/:rw -v /data/data-server/mysql/mysql_bin:/var/lib/mysql-bin/:rw --privileged=true mysql:5.7

启动后查看状态

docker ps -a

显示如下

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
0eb679c5905f        mysql:5.7           "docker-entrypoint.s…"   3 hours ago         Up About an hour    0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

这说明启动成功,如果失败去查看日志,命令如上面所说,查看具体原因

然后进入容器

docker exec -it mysql bash

查看是否有目录/var/lib/mysql-bin,没有就建立一个,有就添加权限如下

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

然后退出容器修改my.cnf

log-bin=/var/lib/mysql-bin/mytest-bin

然后重启一些容器就可以了

docker restart mysql

接着进入mysql环境执行语句

reset master;

这个是刷新日志的

然后查询:

show variables like 'log_%';

结果如下
在这里插入图片描述
红色框显示启动了binlog

查询模式:

show variables like 'binlog_format';

结果
在这里插入图片描述
可以知道是ROW模式

查询已有的日志

show binary logs;

如下
在这里插入图片描述

查看这个日志的内容,因为额二进制文件不能直接打开,使用查询语句

show binlog events in 'mytest-bin.000001';

这里要看需要建立数据库并保存数据

二、创建数据库

create database test_log;
SET NAMES utf8mb4;
DROP TABLE IF EXISTS `preson`;
CREATE TABLE `preson`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `sex` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '男',
  `age` int(3) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `preson` VALUES (1, '小米', '男', 17);
INSERT INTO `preson` VALUES (2, '小李', '女', 16);
INSERT INTO `preson` VALUES (3, '小马', '男', 18);

这样就完成了测试数据的创建

三、数据恢复

这个时候删除数据

然后查看binlog

show binlog events in 'mytest-bin.000001';

结果如下
在这里插入图片描述

这里可以看到我删除了数据,删除操作在position等于2041,我这里要恢复到此之前,进入容器,然后使用mysqlbinlog指令,这段时间的操作就会恢复,但是如果有插入操作可能需要先删除冲突数据

mysqlbinlog mytest-bin.000001 --start-position 1168 --stop-position 1965 | mysql -u root -p test_log

然后数据就恢复了。

这里要注意一下,这里的配置都是对于容器的服务器来说的,不是宿主服务器。

--start-datetime            ##起始时间点

--stop-datetime            ##结束时间点

--start-position            ##起始位置

--stop-position            ##结束位置
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值