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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章