加载sql 文件
在 Docker 环境部署 MySQL 时,加载 .sql 文件主要有两种方式:
- 容器首次启动时自动初始化
- 容器已经运行后手动导入 SQL
首次启动自动加载 SQL:
将 .sql 文件挂载到目录 /docker-entrypoint-initdh.d/ 下,MySQL 首次初始化数据目录时会自动执行。
init.sql 示例:
CREATE DATABASE IF NOT EXISTS test_db;
USE test_db;
CREATE TABLE user (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT
);
INSERT INTO user(name, age) VALUES ('Tom', 18);
使用 Docker Compose 启动容器, docker-compose.yml:
services:
mysql:
image: mysql:8.0
container_name: mysql-demo
restart: always
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: test_db
MYSQL_USER: test
MYSQL_PASSWORD: test123
ports:
- "3306:3306"
volumes:
- ./mysql-data:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
验证步骤:
docker compose up -d
docker exec -it mysql-demo mysql -uroot -proot123
查看数据库
SHOW DATABASES;
USE test_db;
SHOW TABLES;
SELECT * FROM user;
注意:自动初始化只会执行一次。如果容器已经启动,且映射到 /var/lib/mysql 的宿主备份 mysql-data 也存在,那么后面修改 init.sql,再重启容器也不会被执行。
容器运行后手动导入 SQL
- 宿主机直接导入
docker exec -i mysql-demo mysql -uroot -proot123 < ./init.sql
如果 SQL 里没有写 USE database_name;,可以指定数据库:
docker exec -i mysql-demo mysql -uroot -proot123 test_db< ./init.sql
- 先复制 SQL 到容器,再执行
docker cp ./init.sql mysql-demo:/tmp/init.sql
docker exec -it mysql-demo bash
mysql -uroot -proot123 test_db < /tmp/init.sql
备份
备份数据库使用命令 mysqldump
docker exec mysql-demo mysqldump -uroot -proot123 test_db > test_db_backup.sql
# 备份整个数据库
docker exec mysql-demo mysqldump -uroot -proot123 --all-databases > all_backup.sql
# 备份多个数据库
docker exec mysql-demo mysqldump -uroot -proot123 --databases db1 db2 > multi_db_backup.sql
其他选项:
--no-create-info:只备份数据,不备份表结构--no-data:只备份表结构--default-character-set=utf8mb4--single-transaction:数据量大使用,减少备份对业务的影响
恢复数据
docker exec -i mysql-demo mysql -uroot -proot123 test_db < test_db_backup.sql
如果恢复文件中没有 CREATE DATABASE 和 USE,需要指定数据库
docker exec -i mysql-demo mysql -uroot -proot123 test_db < test_db_backup.sql
压缩备份
docker exec mysql-demo mysqldump -uroot -proot123 --databases test_db | gzip > test_db_backup.sql.gz
恢复压缩备份
gunzip < test_db_backup.sql.gz | docker exec -i mysql-demo mysql -uroot -proot123
其他命令
宿主环境执行单条 SQL
docker exec -i mysql-demo mysql -uroot -proot123 -e "SHOW DATABASES;"