MySQL使用dump备份以及恢复备份
MySQL使用dump备份以及恢复备份
项目中需要对mysql
数据进行备份以及恢复。这里记录一个docker
部署的mysql
数据库用dump
全量备份的案例。
注意,用dump
备份时,所有服务是停止的,避免备份时写入操作引起的数据问题。mysql
镜像时latest
版本,Server version: 8.0.27 MySQL Community Server - GPL
。
所有数据库备份
docker exec -it mysql mysqldump -uroot -p123 -A > all.sql
-uroot
指使用root用户;
-p123
指数据库密码是123;
-A
备份所有数据库,导出的sql包含了创建数据库的语句,详情见附录1;
all.sql
备份的文件名,此处文件备份到当前目录。
执行结束后当前目录会有all.sql文件,可以使用cat all.sql
查看里面的内容。
恢复备份
恢复备份命令如下:
docker exec -i mysql mysql -uroot -p123 < all.sql
注意1:这个命令不要-t,否则会报the input device is not a TTY
。
注意2:高版本(据说2.5.0版本以后)会报mysql: [Warning] Using a password on the command line interface can be insecure.
。不能在命令行写密码。
详情查看官方文档6.1.2.1 End-User Guidelines for Password Security。
方法1:使用config_editor
使用下面命令设置登录账号密码。
#设置登录配置
mysql_config_editor set --login-path=login --user=root --password
#查看
mysql_config_editor print --all
---
[login]
user = "root"
password = *****
---
#登录
mysql --login-path=login
此方法在容器内部是可以正常登录的,但在容器外部会报错。
docker exec -it mysql mysql mysql --login-path=login
#mysql: [ERROR] unknown variable 'login-path=login'.
方法2:-p 不输入密码
该方法是使用交互式提供密码。-p
或者--password
后不要输入密码,回车后命令行会出现交互输入方式。
mysql -uroot -p
此方法如果是用脚本程序执行的话,避免不了要输入密码。
方法3:my.cnf
配置账号密码
在/etc
目录下有个my.conf
文件,在该文件里配置账号密码。
此方法测试有效。
详情查看官方文档6.1.2.1 End-User Guidelines for Password Security。
镜像没有安装vim,我这里是把配置文件拷贝出来,改好再拷贝回去。
# 从容器里拷贝回来
docker cp mysql:/etc/mysql/my.conf ./
# 编辑
vi my.conf
---
[client]
host = localhost
user = root
password = '123'
---
# 拷贝回容器
docker cp ./my.conf mysql:/etc/mysql/
# 备份
docker exec -it mysql mysqldump --defaults-extra-file=/etc/mysql/my.cnf -A > ./all.sql
# 恢复
docker exec -i mysql mysql --defaults-extra-file=/etc/mysql/my.cnf < ./all.sql
方法4:JDBC建立连接,Java方式备份
利用JDBC连接,将备份脚本拷贝进容器,然后用jdbc执行source
命令恢复备份。
为了省去拷贝的步骤,最好在创建容器时将mysql容器的卷映射到宿主机器上(防止重新创建容器导致备份丢失)。