docker mysql8.0 啟動,掛資料卷,定時備份,恢復~

Net碼畜發表於2023-03-16

安裝mysql

從mysql社群版的官方源去拉取映象:mysql/mysql-server - Docker Image | Docker Hub

docker run --name=mysql1 -d mysql/mysql-server:latest

 映象起來之後,mysql就默默的初始化好了,直接檢視日誌得到初始化密碼

docker logs mysql1 2>&1 | grep GENERATED; //執行之後會得到GENERATED ROOT PASSWORD: Axegh3kAJyDLaRuBemecis&EShOs

 進放容器,登陸mysql,輸入下面程式碼之後,在密碼框輸入此,輸入上面的顯示的密碼

docker exec -it mysql1 mysql -uroot -p

SQL命令重置密碼

 ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';

充許root遠端訪問

update user set host='%' where user='root';

mysql 安裝,配置,基本就結束了。

掛載資料卷

一般而言預設執行容器,資料會儲存在容器內面,容器暫停,重啟都不會影響容器內面的資料。如果容器被刪除或重建那麼將會丟失資料,合理的作法就是掛載資料卷,這樣刪除容器或者重建容器只需要重新掛裁資料卷就可以恢復如初。mysql預設情況在容器資料目標是:/var/lib/mysql 

我們在母機根目標下建立一個資料夾:

mkdir mysqldata

掛載資料卷使用引數 -v 

-v /mysqldata:/var/lib/mysql

-p 是做埠對映,方便遠端訪問,完整的語句是這樣:

docker run --name=mysql1 -v /mysqldata:/var/lib/mysql -p 3306:3306 -d mysql/mysql-server:latest

定時備份

這裡我們介紹官方自帶的mysqldump,mysqldump命令在容器內面,無需單獨安裝。

登陸容器:

docker exec -it a8471e33b4e0 /bin/bash //a8471e33b4e0是容器ID,自行更換

進入容器之後執行mysqldump,就可以備份進行邏輯備份了。

mysqldump -uroot -p123456 --databases dbname >/mysqlbak/2023-3-15.sql

// -u後面是賬號
// -p後面是密碼
// --databases後面是資料庫名
// /mysqlbak/2023-3-15.sql是備份路徑和檔名

一般來說不需要進入容器也可以備份,完整指令如下:

docker exec -it a8471e33b4e0 mysqldump -uroot -p123456 --databases dbname > /mysqlbak/2023-3-15.sql

注意事項,預設備份下,備份資料會儲存在容器內面所以容器被刪除或重建之後會面臨丟失問題,所以我們也需要掛載一個備份資料卷。

我們在母機根目標下建立一個備份資料夾:

mkdir mysqlbak

結合開頭的資料卷資料夾,我們完整的執行mysql容器的命令應該是這樣如下,容器路徑不用擔心,即使不存在也不會報錯。當然別忘了--restart=always,容器自啟動,這樣重啟之後也可以自己啟動。

docker run --name=mysql1 -v /mysqldata:/var/lib/mysql -v /mysqlbak:/mysqlbak -p 3306:3306 --restart=always -d mysql/mysql-server:latest

我們使用母機crontab定時任務來實現定時備份功能:下面程式碼演示每格一分鐘備份一次,注意第一點在crontab內面需要新增'\'轉義符才能使用%號,每二點docker不能帶-'t',因為crontab不能給他一個終端,會報錯

 

*/1 * * * * docker exec -i 7003ff7c37a7 mysqldump -uroot -p123456 --databases chat > /mysqlbak/$(date +\%Y-\%m-\%d-\%H-\%M-\%S).sql

恢復

可以使有mysql命令進行恢復

mysql -u username -P [dbname] < filename.sql

//username 表示使用者名稱稱。
//p 表示密碼。
//dbname 表示資料庫名稱。
//filename.sql 表示備份檔案的名稱。

我們先使用docker 啟動一個mysql容器,將備份資料夾啟動的時候作為資料卷對映進去,例如這樣:

docker run --name=mysql1 -v /mysqlbak:/mysqlbak -p 3306:3306 --restart=always -d mysql/mysql-server:latest

然後無需進行容器,執行命令恢復mysql

docker exec -it fda84173e7a3 mysql -uroot -p123456 < /mysqlbak/2023-03-16-11-26-02.sql

//fda84173e7a3 為容器ID

 

相關文章