获取mysql镜像
1 | ➜ ~ docker pull mysql |
启动mysql
1 | ➜ ~ docker run -itd --name docker-mysql-master -v /Users/chenyuan/Data/docker/mysql-data-master:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -p 33061:3306 mysql |
确定挂载的mysql-data文件
1 | ➜ mysql-data-master ll |
Binlog配置
查看binlog日志的地方,通过命令查看。因为没有设置过所以看不到。
1 | mysql> show variables like '%datadir%'; |
当前容器提交为镜像
到这里遇到一个非常好玩的事情,就是获取的mysql镜像是一个非常干净的容器,常用的命令都没有。比如:yum、ifconfig、cat等。所以我需要把当前的容器打一个镜像包。并且docker run的时候要挂载一个本地的目录,避免待会儿需要上传一些工具包。
1 | docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] |
1 | ➜ ~ docker commit -a "chengcheng222e@sina.com" -m "created by vernon" 88820868af12 mysql-versnon:v1 |
这里注意一下,因为docker pull mysql
镜像中的shell
里面命令太少了,非常的不方便。这里建议大家还是利用dockefile
的方式或者是docker pull centos
的方式来安装mysql,不然你会怀疑人生。
通过dockerfile
的方式:
1 | FROM centos:7 |
my.conf配置
修改my.conf的内容
1 | [client] |
Binlog格式
Binlog的格式也有三种:STATEMENT、ROW、MIXED 。
STATMENT模式:基于SQL语句的复制(statement-based replication, SBR),每一条会修改数据的sql语句会记录到binlog中。
- 优点:不需要记录每一条SQL语句与每行的数据变化,这样子binlog的日志也会比较少,减少了磁盘IO,提高性能。
- 缺点:在某些情况下会导致master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)
基于行的复制(row-based replication, RBR):不记录每一条SQL语句的上下文信息,仅需记录哪条数据被修改了,修改成了什么样子了。
- 优点:不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。
- 缺点:会产生大量的日志,尤其是alter table的时候会让日志暴涨。
混合模式复制(mixed-based replication, MBR):以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。
设置Binglog
通过show variables
的方式来查看binlog的一个实际情况。
1 | mysql> show variables like '%log_bin%'; |
从上面可以看出,没有开启binlog日志,那么我们接下来开启binlog。
在/etc/my.cnf里面开启binlog配置。
1 | server-id = 1 |
再次查看:
1 | mysql> show variables like '%log_bin%'; |
查看binlog_format
1 | mysql> show variables like 'binlog_format'; |
确定binlog日志文件
1 | show binlog events; |
创建表
1 | mysql> use test; |
查看binlog
1 | show binlog events in 'mysql-bin.000001'; |
常用命令
1 | show variables like 'binlog_format' |
遇到问题:
1 | [mysql@c738746e9623 support-files]$ ./mysql.server start |
参考地址:
如果大家喜欢我的文章,可以关注个人订阅号。欢迎随时留言、交流。