MySQL容器數(shù)據(jù)同步是將一個容器中的MySQL數(shù)據(jù)庫數(shù)據(jù)復(fù)制到另一個容器中的過程。常見的應(yīng)用場景包括:
- 將生產(chǎn)環(huán)境的MySQL數(shù)據(jù)同步到測試環(huán)境的容器中,以便進(jìn)行測試。
- 將一個容器中的MySQL數(shù)據(jù)備份到另一個容器中,以實現(xiàn)數(shù)據(jù)的冷備份。
- 將一個容器中的MySQL數(shù)據(jù)同步到另一個地理位置的容器中,以實現(xiàn)數(shù)據(jù)的熱備份。
下面我們演示一下如何使用docker-compose和mysqldump實現(xiàn)容器數(shù)據(jù)同步。
version: '3'
services:
db:
image: mysql:5.7
container_name: db
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
- /docker/mysql/data:/var/lib/mysql
db-copy:
image: mysql:5.7
container_name: db-copy
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
- /docker/mysql/data-copy:/var/lib/mysql
command:
- sh
- -c
- >mysqldump -u root -p${MYSQL_ROOT_PASSWORD} --databases db >/tmp/db.sql
&& mysql -u root -p${MYSQL_ROOT_PASSWORD}< /tmp/db.sql
在上述docker-compose文件中,我們定義了兩個MySQL容器,一個名為db,另一個是db-copy。這兩個容器都運行相同的MySQL 5.7的鏡像。其中db容器是源容器,存儲了我們的MySQL數(shù)據(jù);db-copy容器是目標(biāo)容器,我們將通過mysqldump將源容器中的數(shù)據(jù)轉(zhuǎn)儲到/tmp/db.sql文件中,并將這個文件導(dǎo)入到目標(biāo)容器中,從而實現(xiàn)容器數(shù)據(jù)同步。
我們可以通過docker-compose up啟動這兩個容器:
$ docker-compose up -d
這時我們可以登錄到db容器中,往其中插入一些數(shù)據(jù):
$ docker exec -it db mysql -uroot -ppassword
mysql>CREATE DATABASE db;
mysql>USE db;
mysql>CREATE TABLE users (id INT, name VARCHAR(20));
mysql>INSERT INTO users VALUES (1, 'John'), (2, 'Jane');
當(dāng)我們確認(rèn)數(shù)據(jù)已經(jīng)在db容器中被創(chuàng)建后,我們可以執(zhí)行mysqldump并將數(shù)據(jù)導(dǎo)入到db-copy容器中:
$ docker exec -it db-copy bash
root@db-copy:/# mysqldump -u root -ppassword --databases db >/tmp/db.sql
root@db-copy:/# mysql -u root -ppassword< /tmp/db.sql
現(xiàn)在我們可以登錄到db-copy容器中檢查數(shù)據(jù)是否被正確地導(dǎo)入了:
$ docker exec -it db-copy mysql -uroot -ppassword
mysql>USE db;
mysql>SELECT * FROM users;
+------+-------+
| id | name |
+------+-------+
| 1 | John |
| 2 | Jane |
+------+-------+
2 rows in set (0.00 sec)
這時我們已經(jīng)成功地將db容器中的數(shù)據(jù)同步到了db-copy容器中。