系统: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
时是否操作更新,一般会关闭使用赋值为on
或1
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 ##结束位置