MacOS使用Docker建立MySQL主從資料庫

土倫發表於2021-12-27

一、拉取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)

相關文章