使用Docker實(shí)現(xiàn)MySQL容器中批量導(dǎo)出所有數(shù)據(jù)庫(kù)
在使用 Docker 部署 MySQL 的場(chǎng)景中,經(jīng)常會(huì)遇到這樣的需求:一次性導(dǎo)出容器內(nèi)除系統(tǒng)庫(kù)以外的所有數(shù)據(jù)庫(kù),并分別生成 .sql 文件,用于備份或遷移。
本文介紹一種無(wú)需進(jìn)入交互式容器、通過(guò)一條 docker exec 命令,在容器內(nèi)生成并執(zhí)行導(dǎo)出腳本的實(shí)現(xiàn)方式。
一、整體思路
實(shí)現(xiàn)流程如下:
- 通過(guò)
docker exec在 MySQL 容器中執(zhí)行 Bash - 動(dòng)態(tài)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)導(dǎo)出腳本
export_dbs.sh - 使用
mysql命令獲取所有數(shù)據(jù)庫(kù)列表 - 過(guò)濾掉系統(tǒng)數(shù)據(jù)庫(kù)
- 循環(huán)調(diào)用
mysqldump,將每個(gè)數(shù)據(jù)庫(kù)導(dǎo)出為獨(dú)立的.sql文件 - 將導(dǎo)出文件保存到容器內(nèi)
/tmp目錄
二、完整命令示例
docker exec -it mysql-container bash -c "cat << 'EOF' > /tmp/export_dbs.sh
#!/bin/bash
PASSWORD=\"root\"
mysql -uroot -p\${PASSWORD} --socket=/var/run/mysqld/mysqld.sock -e \"SHOW DATABASES;\" | \
grep -v \"Database\" | \
grep -v \"information_schema\" | \
grep -v \"mysql\" | \
grep -v \"performance_schema\" | \
grep -v \"sys\" | \
while read db; do
echo \"Exporting database: \$db\"
mysqldump -uroot -p\${PASSWORD} \
--socket=/var/run/mysqld/mysqld.sock \
--databases \"\$db\" > \"/tmp/\$db.sql\"
done
echo \"Export completed.\"
EOF
chmod +x /tmp/export_dbs.sh
/tmp/export_dbs.sh"
三、關(guān)鍵部分詳解
1. docker exec 執(zhí)行容器內(nèi)命令
docker exec -it mysql-container bash -c "..."
mysql-container:MySQL 容器名稱(chēng)bash -c:在容器中執(zhí)行一段 Bash 命令-it:支持交互與終端輸出
2. 使用 Here Document 生成腳本
cat << 'EOF' > /tmp/export_dbs.sh
- 使用 Here Document 寫(xiě)入多行腳本
'EOF'使用單引號(hào)可避免變量在宿主機(jī)側(cè)被提前展開(kāi)- 腳本被寫(xiě)入容器內(nèi)
/tmp/export_dbs.sh
3. MySQL 認(rèn)證方式
PASSWORD="root"
mysql -uroot -p${PASSWORD} --socket=/var/run/mysqld/mysqld.sock
- 使用 root 用戶(hù)連接
- 通過(guò) Unix Socket 連接 MySQL(適用于官方 MySQL Docker 鏡像)
- 避免 TCP 連接帶來(lái)的端口問(wèn)題
4. 獲取并過(guò)濾數(shù)據(jù)庫(kù)列表
SHOW DATABASES;
配合 grep -v 過(guò)濾系統(tǒng)數(shù)據(jù)庫(kù):
information_schemamysqlperformance_schemasys
最終只保留業(yè)務(wù)數(shù)據(jù)庫(kù)。
5. 循環(huán)導(dǎo)出數(shù)據(jù)庫(kù)
while read db; do mysqldump --databases "$db" > "/tmp/$db.sql" done
特點(diǎn):
- 每個(gè)數(shù)據(jù)庫(kù)生成一個(gè)獨(dú)立的 SQL 文件
- 文件命名規(guī)則:
數(shù)據(jù)庫(kù)名.sql - 便于單庫(kù)恢復(fù)與管理
四、導(dǎo)出結(jié)果說(shuō)明
導(dǎo)出完成后:
SQL 文件位于容器內(nèi):
/tmp/*.sql
如需拷貝到宿主機(jī),可使用:
docker cp mysql-container:/tmp/dbname.sql .
或批量拷貝整個(gè)目錄。
五、適用場(chǎng)景
MySQL Docker 容器備份
數(shù)據(jù)遷移前批量導(dǎo)出
CI / 自動(dòng)化備份腳本
測(cè)試環(huán)境數(shù)據(jù)庫(kù)快照
六、注意事項(xiàng)
不建議在生產(chǎn)環(huán)境明文寫(xiě)密碼(可改用 .my.cnf)
大庫(kù)導(dǎo)出時(shí)注意磁盤(pán)空間
可根據(jù)需要添加 --single-transaction 以減少鎖表
七、總結(jié)
通過(guò)一條 docker exec 命令,我們實(shí)現(xiàn)了:
- 在容器內(nèi)動(dòng)態(tài)生成腳本
- 自動(dòng)過(guò)濾系統(tǒng)數(shù)據(jù)庫(kù)
- 批量導(dǎo)出所有業(yè)務(wù)庫(kù)
- 無(wú)需手動(dòng)進(jìn)入容器操作
到此這篇關(guān)于使用Docker實(shí)現(xiàn)MySQL容器中批量導(dǎo)出所有數(shù)據(jù)庫(kù)的文章就介紹到這了,更多相關(guān)Docker MySQL導(dǎo)出數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何解決mysql配置文件錯(cuò)誤導(dǎo)致在docker中無(wú)法啟動(dòng)的問(wèn)題
這篇文章主要介紹了如何解決mysql配置文件錯(cuò)誤導(dǎo)致在docker中無(wú)法啟動(dòng)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Centos中使用Docker安裝rabbitmq的問(wèn)題記錄
這篇文章主要介紹了Centos中使用Docker安裝rabbitmq的問(wèn)題記錄,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-05-05
詳解基于Harbor搭建Docker私有鏡像倉(cāng)庫(kù)
這篇文章主要介紹了詳解基于Harbor搭建Docker私有鏡像倉(cāng)庫(kù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
docker進(jìn)入容器運(yùn)行命令的使用及說(shuō)明
本文介紹了如何使用Docker進(jìn)入容器進(jìn)行調(diào)試、管理和運(yùn)行命令,主要包括使用docker exec、docker attach和nsenter命令進(jìn)入容器的方法,并詳細(xì)介紹了docker inspect命令的使用以及如何獲取容器/鏡像的元數(shù)據(jù)2026-02-02
docker 部署 Elasticsearch kibana及ik分詞器詳解
這篇文章主要介紹了docker 部署 Elasticsearch kibana及ik分詞器詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05

