docker安装mysql,以及主从和主备切换

前言

使用docker也有一段时间了。正巧最近公司也在做mysql主从和读写分离这块的内容,之前的比较蠢的办法就是在代码层面配置多个数据源然后在执行sql的时候切换。同事偶然给我说了mycat。所以就试试看打算用mycat做读写分离等。但是用mycat前提是先准备好多个mysql数据库。所以就打算用docker来处理,不然本地安装很多mysql也是一个很麻烦的事情

1.拉取镜像

docker pull mysql:5.7

2.准备配置文件

mysql5.7的docker镜像上这么说
MySQL(5.7.19)的默认配置文件是 /etc/mysql/my.cnf 文件。如果想要自定义配置,建议向 /etc/mysql/conf.d 目录中创建 .cnf 文件。新建的文件可以任意起名,只要保证后缀名是 cnf 即可。新建的文件中的配置项可以覆盖 /etc/mysql/my.cnf 中的配置项。
首先在/root/mysql/mysqld.cnf创建好mysql的配置文件
因为要做主从和主备切换,所以在mysqld.cnf文件中需要修改一些参数

[client]  
default-character-set=utf8#utf-8设置
[mysql]  
default-character-set=utf8#utf-8设置
[mysqld]  
collation-server = utf8_unicode_ci#utf-8设置
init-connect='SET NAMES utf8'#utf-8设置
character-set-server = utf8#utf-8设置
server_id = 1#mysql主从的重要属性,要保证主库和从库的server_id不同
log_bin = log#因为要做主从切换,所以主库和从库都开启。如果只是读写。就只要主库配置即可
replicate-do-db=tt#需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
replicate-ignore-bb#db=不需要复制的数据库名,如果忽略多个数据库,重复设置这个选项即可

3.创建容器

docker run --name mysql -p 3306:3306 -v /root/mysql/1/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -e MYSQL_ROOT_PASSWORD=123qwe -d mysql:5.7

解释一下:
-p 3306:3306:把容器3306端口映射到宿主机的3306端口
-e MYSQL_ROOT_PASSWORD=123qwe:设置初始密码为123qwe
-v /root/mysql/1/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf:把宿主机内的配置文件挂载到容器中
然后进入容器连入mysql,设置远程权限和主从复制的账号:

docker exec -it mysql /bin/bash
mysql -u root -p
grant all privileges on *.* to root@"%" identified by "new password";#设置用户 root 可以在本地被访问:
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY 'slave';#设置主从开始的账号
flush privileges;#刷新权限使得刷新

这样mysql就算是开启完毕了。注意这个是主库

4.创建从库容器

docker run --name mysql-salve -p 3307:3306 -v /root/mysql/1/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -e MYSQL_ROOT_PASSWORD=123qwe -d mysql:5.7

之后的配置同理第三步的配置

5.开启主从

5.1主库操作

mysqldump -uroot -p'password'  --master-data=2 --single-transaction -R --triggers -A > /backup/all.sql
show master status;

显示为:
+————+———-+————–+——————+——————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+————+———-+————–+——————+——————-+
| log.000001 | 154 | | | |
+————+———-+————–+——————+——————-+

5.2从库操作

stop slave;#暂停从库
CHANGE MASTER TO MASTER_HOST='ip地址',master_port=3306,MASTER_USER='slave',MASTER_PASSWORD='slave',MASTER_LOG_FILE='log.000001',MASTER_LOG_POS=154;#注意其中的日志文件和数值要一一对应
start slave;#启动复制
show slave status \G;

然后从显示的数据中看到
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
说明主从已经开启了完毕了。

5.3从库只读操作

show global variables like "%read_only%";#显示表的读写属性

+———————–+——-+
| Variable_name | Value |
+———————–+——-+
| innodb_read_only | OFF |
| read_only | OFF |
| super_read_only | OFF |
| transaction_read_only | OFF |
| tx_read_only | OFF |
+———————–+——-+
主要是那个read_only
off就是关闭只读,on是开启只读
开启只读:

flush tables with read lock;#使得具有super权限的用户也不能写操作
set global read_only=1;#确保普通用户不能写操作

关闭只读:

unlock tables;
set global read_only=0;

6.主从切换

6.1从库切换为主库

show slave status \G
STOP SLAVE;
RESET MASTER;
RESET SLAVE;
show master status \G

显示为:
+————+———-+————–+——————+——————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+————+———-+————–+——————+——————-+
| log.000001 | 154 | | | |
+————+———-+————–+——————+——————-+

6.2主库切换为从库

show master status \G
STOP SLAVE;
RESET MASTER;
RESET SLAVE;
CHANGE MASTER TO MASTER_HOST='ip地址',master_port=3307,MASTER_USER='slave',MASTER_PASSWORD='slave',MASTER_LOG_FILE='log.000001',MASTER_LOG_POS=154;#操作和之前的设置从库基本一致
start slave;
show slave status \G

你可能感兴趣的:(linux,docker,mysql)