docker
啓動兩個 mysql
容器, 你也能夠安裝兩個 mysql 前提版本一致建立
msyql
掛載目錄html
[root@localhost /]# mkdir -p /opt/docker/mysql1/conf/ [root@localhost /]# mkdir -p /opt/docker/mysql1/logs/ [root@localhost /]# mkdir -p /opt/docker/mysql1/data/
啓動第一個
mysql
掛載對應的文件目錄port:
6894
mysql
[root@localhost /]# docker run -d -p 6894:3306 --name mysql1 \ -v /opt/docker/mysql1/conf:/etc/mysql/ \ -v /opt/docker/mysql1/logs:/logs \ -v /opt/docker/mysql1/data:/var/lib/mysql \ --privileged=true \ -e MYSQL_ROOT_PASSWORD=qtykGhC29eP4Smp mysql:5.7
經過拷貝第二個
mysql
sql須要注意復的
mysql
/opt/docker/mysql2/data/auto.cnf
目錄下有一個 auth.cnf 須要刪除docker
[root@localhost docker]# cp -r /opt/docker/mysql1/ /opt/docker/mysql2/
刪除
auth.cnf
文件shell
[root@localhost docker]# rm -f /opt/docker/mysql2/data/auto.cnf
啓動第二個
mysql
數據庫
[root@localhost docker]# docker run -d -p 6895:3306 --name mysql2 \ -v /opt/docker/mysql2/conf:/etc/mysql/ \ -v /opt/docker/mysql2/logs:/logs \ -v /opt/docker/mysql2/data:/var/lib/mysql \ --privileged=true \ -e MYSQL_ROOT_PASSWORD=qtykGhC29eP4Smp mysql:5.7
主庫 my.cnf 文件vim
[root@localhost docker]# vim /opt/docker/mysql1/conf/my.cnf
my.cnf 文件內容服務器
[mysqld] # 主庫配置 server-id=1 # 服務 id 惟一性 log-bin=mysql1-log # 開啓二進制日誌 binlog-format=ROW # 日誌記錄模式 replicate-do-db=db_docker # 要複製的數據名稱 # replicate-ignore-db=db_docker # 不須要複製的數據名稱
從庫 my.cnf 文件ide
[root@localhost docker]# vim /opt/docker/mysql2/conf/my.cnf
my.cnf 文件內容工具
[mysqld] # 從庫配置 server-id=2 # 服務 id 惟一性 log-bin=mysql2-log # 開啓二進制日誌 binlog-format=ROW # 日誌記錄模式 binlog-do-db=db_docker # 要複製的數據名稱 # binlog-ignore-db=db_docker # 不須要複製的數據名稱
重啓
docker
mysql
容器
[root@localhost docker]# docker restart mysql1 [root@localhost docker]# docker restart mysql2
兩個
mysql
分別執行如下sql
語句建立數據庫建立表
-- 建立數據庫 CREATE DATABASE `db_docker`; USE db_docker; -- 建立表 CREATE TABLE `t_docker` ( `id` INT ( 11 ) NOT NULL AUTO_INCREMENT, `name` VARCHAR ( 255 ) DEFAULT NULL, PRIMARY KEY ( `id` ) ) ENGINE = INNODB AUTO_INCREMENT =0 DEFAULT CHARSET = utf8;
主庫執行如下命令輸出二進制日誌文件的狀態信息
mysql> SHOW MASTER STATUS ; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 2223 | | | | +------------------+----------+--------------+------------------+-------------------+
從庫更改用於鏈接到複製主庫、讀取主庫的二進制日誌和讀取從庫的中繼日誌的參數
CHANGE MASTER TO MASTER_HOST="192.168.101.59", # 主機地址 你的主服務器 ip Master_Port=6894, # 端口 MASTER_USER="root", # 帳號 MASTER_PASSWORD="qtykGhC29eP4Smp", # 密碼 MASTER_LOG_FILE="mysql-bin.000001", # 主庫二進制文件名 根據實際狀況填寫 MASTER_LOG_POS=377; # 主庫二進制文件位置 根據實際狀況填寫
從庫執行,啓動複製
mysql> START SLAVE;
從庫線程的基本參數的狀態信息。從 MySQL 8.0.22 開始,使用
SHOW REPLICA STATUS
代替SHOW SLAVE STATUS
,該版本已棄用。在 MySQL 8.0.22 以前的版本中,使用SHOW SLAVE STATUS
. 該語句須要REPLICATION CLIENT
特權(或已棄用的SUPER
特權)。如下兩參數爲 yes 表示配置成功,不然配置有問題。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
若是以上兩個參數有一個未 No 說明有錯誤,請查看這個兩個字段
Last_Errno
Last_Error
錯誤內容會記錄在
Last_Error
這個字段中,根據錯誤內容修改。
mysql> SHOW SLAVE STATUS \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.101.59 Master_User: root Master_Port: 6894 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 2223 Relay_Log_File: 98394ee2fb48-relay-bin.000004 Relay_Log_Pos: 320 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 2223 Relay_Log_Space: 534 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: aa58ab20-f500-11eb-aa65-0242ac110002 Master_Info_File: /var/lib/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version:
中止主庫的數據更新操做
mysql>flush tables with read lock;
主庫解鎖
mysql>unlock tables;
從庫執行,中止複製; 當從庫配置二進制日誌出錯時,須要中止複製或重置,再從新配置,讓後啓動複製
mysql> STOP SLAVE;
從庫執行,重置複製
mysql> RESET SLAVE;
3306
容易被攻擊進入容器
docker exec -it mysql2 /bin/sh # mysql2 容器名稱 這裏也能夠是容器 id
登陸
mysql
mysql -u root -pqtykGhC29eP4Smp
mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 9 Server version: 5.7.35-log MySQL Community Server (GPL) Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
[mysqld] # 主庫配置 # 指定一個惟一的服務器 ID,能夠爲0可是服務器會拒絕,因此有效值 1~4294967295 之間。默認值1 # 官網 https://dev.mysql.com/doc/refman/5.7/en/replication-options.html server-id=1 # 開啓二進制日誌,二進制文件名稱,能夠是路徑 例如: /logs/mysql/log 可是須要注意給目錄文件提權,不然mysql能夠無權寫入,致使報錯。 log-bin=mysql1-log # 日誌記錄模式 有三種 # STATEMENT 致使日誌記錄基於語句。 # ROW 致使日誌記錄基於行。這是默認設置。 # MIXED 致使日誌記錄使用混合格式。介於 前兩種模式之間 # 官網 https://dev.mysql.com/doc/refman/5.7/en/binary-log-setting.html binlog-format=ROW # 要複製的數據名稱,要指定多個數據庫,您必須使用此選項的多個實例。 # 因爲數據庫名稱能夠包含逗號,若是您提供逗號分隔列表,則該列表將被視爲單個數據庫的名稱。 # 多個實例: # replicate-do-db=db_docker1 # replicate-do-db=db_docker2 replicate-do-db=db_docker # 不須要複製的數據名稱,配置同上 # replicate-ignore-db=db_docker # 不須要複製的數據名稱
[mysqld] # 從庫配置同上 觸類旁通 server-id=2 # 服務 id 惟一性 log-bin=mysql2-log # 開啓二進制日誌 binlog-format=ROW # 日誌記錄模式 binlog-do-db=db_docker # 要複製的數據名稱 # binlog-ignore-db=db_docker # 不須要複製的數據名稱
文件內容
server-uuid
這裏 UUID 也是必須惟一,啓動的時候會自動生成。若是您也是經過複製
mysql
data
目錄建立的數據庫須要刪除該文件
[auto] server-uuid=aa58ab20-f500-11eb-aa65-0242ac110002
UUID相同會報如下錯誤
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
官網二進制日誌配置:https://dev.mysql.com/doc/refman/5.7/en/replication-options-binary-log.html