一、拉取MySQL映象
通過終端獲取最新的MySQL映象
docker pull mysql/mysql-server
二、建立MySQL資料庫容器配置檔案對應目錄
我們在當前使用者下建立一組目錄,用來存放MySQL容器配置檔案,(Linux下可以省略此步驟)參考下圖:
注意:MySQL8版本以後,需要在對映檔案中加入 mysql-files,否則MySQL資料庫容器會建立失敗。
因為在MacOS下不支援vi/vim 直接修改my.cnf檔案,也不支援apt-get安裝vim,所以需要在本地新建兩個my.cnf對映檔案。(Linux下可以通過vim直接修改配置檔案)
master主庫對應的my.cnf配置檔案為:
[mysqld] server_id = 1 log-bin= mysql-bin read-only=0 replicate-ignore-db=mysql replicate-ignore-db=sys replicate-ignore-db=information_schema replicate-ignore-db=performance_schema
slave從庫對應的my.cnf配置檔案為:
[mysqld] server_id = 2 log-bin= mysql-bin read-only=1 replicate-ignore-db=mysql replicate-ignore-db=sys replicate-ignore-db=information_schema replicate-ignore-db=performance_schema
三、建立兩個MySQL資料庫容器
建立master主資料庫容器
docker run --name mysql-master -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /Users/yumaster/test/mysql_master_slave/master/data:/var/lib/mysql -v /Users/yumaster/test/mysql_master_slave/master/conf/my.cnf:/etc/mysql/my.cnf -v /Users/yumaster/test/mysql_master_slave/master/mysql-files:/var/lib/mysql-files mysql/mysql-server
建立slave從資料庫容器
docker run --name mysql-slave -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /Users/yumaster/test/mysql_master_slave/slave/data:/var/lib/mysql -v /Users/yumaster/test/mysql_master_slave/slave/conf/my.cnf:/etc/mysql/my.cnf -v /Users/yumaster/test/mysql_master_slave/slave/mysql-files:/var/lib/mysql-files mysql/mysql-server
如下圖,說明兩個MySQL容器建立成功
此時我們開啟Docker儀表板可以看到,兩個容器已經執行起來了。而且埠就是我們之前建立的對應埠
我們通過Navicat連線會報哦1130錯誤,是因為所連線的使用者賬戶沒有遠端連線的許可權。需要更改mysql資料庫裡的user表裡的host項
把localhost改成%
具體步驟:
mysql> use mysql Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select host from user where user='root'; +-----------+ | host | +-----------+ | localhost | +-----------+ 1 row in set (0.01 sec) mysql> update user set host='%' where user = 'root'; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select host from user where user='root'; +------+ | host | +------+ | % | +------+ 1 row in set (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)
四、主從資料庫配置
master主資料庫配置:
//進入master主資料容器 docker exec -it mysql-master mysql -uroot -p123456 //建立一個使用者來同步資料,每個slave使用標準的MySQL使用者名稱和密碼連線master。進行復制操作的使用者會授予REPLICATION SLAVE 許可權。mysql8 之前的版本中加密規則是mysql_native_password,而在mysql8之後,加密規則是caching_sha2_password CREATE USER 'slave'@'%' IDENTIFIED BY '123456';(這樣有可能在slave建立與master連線時報錯) 或 CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; //對使用者進行授權 GRANT REPLICATION SLAVE ON *.* to 'slave'@'%'; //檢視狀態,記住File、Position的值,在Slave中將用到 show master status; //查詢master容器的IP,會在slave設定主庫連線時用到 docker inspect mysql-master | grep IPA;
mster的狀態,File mysql-bin.000003 Position 661
slave從資料庫配置:
//進入slave從資料容器 docker exec -it mysql-slave mysql -uroot -p123456 //設定主庫連結 change master to change master to master_host='172.17.0.2',master_user='slave',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=661,master_port=3306; //啟動從庫同步 start slave; //檢視狀態 show slave status\G; //如果 show slave status\G命令結果中出現: //Slave_IO_Running: Yes //Slave_SQL_Running: Yes //以上兩項都為Yes,那說明沒問題了。 //否則,從新配置從資料 stop slave; reset slave all;
啟動從庫同步成功
五、主從驗證
我們在master上建立一個資料庫,然後建立一張表,再插入一條資料,相應的slave也會增加;
create database master_slave_demo; use master_slave_demo; create table userinfo(username varchar(50),age int); insert into userinfo values('Toulon',25); select * from userinfo;
在執行命令之前,主從資料庫數量相同;
master執行命令之後slave增加對應資料
可以發現主庫新增的資料已經同步過來了,MySQL的主從複製就設定完成了。(測試環境,MacOS M1 ARM64機器,Docker,MySQL 8.0.27)