备份 MySQL 数据库核心就是使用 mysqldump 命令,如;
mysqldump -h127.0.0.1 -P3306 -utest -p123456 student > I:\sql\2021-07-27_14-19-14\student.sql
注意:使用备份命令需要开启相关数据库权限,如下:我的数据库比较简单,只需要开启三个权限
备份 MySQL 必要权限,参考我的另一篇博客 https://blog.csdn.net/qq_41538097/article/details/118928032
还原 mysql 方法比较多,可以使用 可视化工具导入,或者使用 source 命令导入,下面说说和备份命令相对的还原命令
mysql -h127.0.0.1 -P3306 -utest -p123456 student < 2021-07-27_14-19-04\student.sql
注意以下几点
如果要使用脚本实现,可参考备份脚本自行实现
shell需要用刚学的,小白一个,可能考虑不够全面,望见谅
#!/bin/bash
dateBackup=$(date +%Y-%m-%d_%H:%M:%S)
dir="/root/backupDB/sql/${dateBackup}"
if [ ! -d "${dir}" ]
then
mkdir ${dir}
echo "创建文件夹成功"
else
echo "文件夹已经存在"
fi
# 需要备份的数据库名
dbNames=(mybatis mybatis-plus)
for dbName in ${dbNames[@]}
do
echo "-----------------> 备份 ${dbName} 数据库 <-----------------" >> /root/backupDB/log/${dateBackup}.log
# 备份MySQL, 1>> 为正常输出,2>> 为错误或者警告输出到日志文件
mysqldump -utest -p123456 ${dbName} 1>> ${dir}/${dbName}.sql 2>> /root/backupDB/log/${dateBackup}.log
# 压缩文件 解压为 gzip -d mybatis.sql.gz
gzip ${dir}/${dbName}.sql
done
echo -e " \n ----------------> 删除过期文件 <---------------------------" >> /root/backupDB/log/${dateBackup}.log
# 判断文件夹数量是否大于7,防止程序意外停止,删除所有备份
dirCount=`ls -l /root/backupDB/sql/|grep "^d"|wc -l`
if [ ${dirCount} -gt 7 ]
then
# 删除超过七天的 sql 备份
find /root/backupDB/sql -mtime +6 -name "*_*" -exec rm -rf {} \;
#删除超过七天的 日志
find /root/backupDB/log -mtime +6 -name "*.log" -exec rm -rf {} \;
echo -e " 删除过期文件成功" >> /root/backupDB/log/${dateBackup}.log
else
echo "删除过期文件失败,文件数量小于 7 " >> /root/backupDB/log/${dateBackup}.log
fi
可以使用 chmod 777 backup.sh 添加执行权限, ./backup.sh 启动
或者
使用 sh ./backup.sh 启动
如果你的 mysql 是 docker 容器,则需要修改上面的 mysqldump 备份命令如下
docker exec -i 111122223333 /bin/bash -c 'mysqldump -utest -p123456 ${dbName} 1>> ${dir}/${dbName}.sql 2>> /root/backupDB/log/${dateBackup}.log'
可以在启动时加一个挂载目录 ,我备份 sql 的挂载目录为 -v /opt/docker/mysql/backup:/opt/backup
,/opt/docker/mysql/backup宿主机目录,/opt/backup容器目录
#!/bin/bash
dateBackup=$(date +%Y-%m-%d_%H:%M:%S)
dir=/opt/docker/mysql/backup/${dateBackup}
# 宿主机新建目录,通过挂载会自动添加到容器
if [ ! -d "${dir}"]
then
mkdir ${dir}
echo "创建文件夹 ${dir} 成功" >> ${dir}/error.log
else
echo "创建文件夹 ${dir} 失败,文件夹已存在" >> ${dir}/error.log
dbNames=(student teacher car dog cat)
for dbName in ${dbNames[@]}
do
echo "-----------------> 备份 ${dbName} 数据库 <-----------------" >> ${dir}/error.log
docker exec -i 642c89599d9b sh -c "mysqldump -ubackup -pAdmin@123 -h127.0.0.1 -P32773 ${dbName} 1>> /opt/backup/${dateBackup}/${dbName}.sql 2>> /opt/backup/${dateBackup}/error.log"
gzip ${dir}/${dbName}.sql
done
echo -e " \n ----------------> 删除过期文件 <---------------------------" >> ${dir}/error.log
# 判断文件夹数量是否大于7,防止程序意外停止,删除所有备份
dirCount=`ls -l /opt/docker/mysql/backup/|grep "^d"|wc -l`
if [ ${dirCount} -gt 7 ]
then
# 删除超过七天的带"_"的目录
find /opt/docker/mysql/backup/ -mtime +6 -name "*_*" -exec rm -rf {} \;
echo -e " 删除过期文件成功" >> ${dir}/error.log
else
echo "删除过期文件失败,文件数量小于 7 " >> ${dir}/error.log
fi
如果上面的脚本可以正常执行,下面开启定时任务,固定在每天凌晨一点执行
如果没有 crontab 命令自行百度,cron 表达式不清楚的自行百度
- 1、添加定时任务
crontab -e- 2、凌晨 01:00 分执行 /root/backupDB/backup.sh 文件
0 1 * * * /root/backupDB/backup.sh- 3、查看定时任务
crontab -l- 4、查看定时任务日志
tail -f /var/loxg/cron- 5、crond 服务
开启、关闭、重启 可以使用 systemctl start、stop、restart crond
添加定时任务,记得重启 crond 服务,systemctl restart crond
一般数据库备份都不是一份且不放在同一个服务器上,如果 mysql 直接在 Linux 服务器,则可以不用 scp 传输,因为备份命令可以指定另一台服务器 ip ,但是如果是 docker 容器中 mysql ,需要将备份文件拷贝到远程主机(或许 docker 有一些高端操作,暂时没遇到),因为 docker 容器备份 MySQL 只能在当前主机,scp 拷贝 docker 中 备份的 mysql 到另一台服务器看我另一篇博客 scp 传输文件到另一台服务器
这种用的不多
public class TestBackup {
public static void main(String[] args) throws Exception {
dbBackUp("111.111.111.111", "test", "123456", "3306", "mybatis,mybatis-plus", "I:\\spring\\sendsms\\");
//reduction("111.111.111.111", "3306", "root", "123456", "mybatis-plus", "2021-07-27_14-19-04/mybatis-plus.sql");
}
public static void dbBackUp(String host, String userName, String password, String port, String dbNames, String backupPath) {
String format = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss").format(new Date());
boolean mkdir = new File(format).mkdir();
if (!mkdir) return;
String[] dbNameArray = dbNames.split(",");
for (String dbName : dbNameArray) {
String pathSql = backupPath + format + "\\" + dbName + ".sql";
String cmd = "cmd /c mysqldump" + " -h" + host + " -P" + port + " -u" + userName + " -p" + password + " " + dbName + " > " + pathSql;
System.out.println("cmd命令为:" + cmd);
try {
Process process = Runtime.getRuntime().exec(cmd);
if (process.waitFor() == 0) {
System.out.println(dbName + "数据库备份成功!");
} else {
System.out.println(dbName + "数据库备份失败!");
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
public static void reduction(String host, String port, String userName, String password, String databaseName, String fileName) throws Exception {
File datafile = new File(fileName);
if (!datafile.exists()) {
System.out.println(fileName + "文件不存在,请检查");
return;
}
String cmd = "cmd /c mysql -h" + host + " -P" + port + " -u" + userName + " -p" + password + " " + databaseName + " < " + datafile;
System.out.println(cmd);
//拼接cmd命令
Process exec = Runtime.getRuntime().exec(cmd);
if (exec.waitFor() == 0) {
System.out.println(databaseName + "数据库还原成功,还原的文件为:" + datafile);
} else {
System.out.println(databaseName + "数据库还原失败");
}
}
}
核心命令和上面类似,适用与 window系统服务器
①、新建 backup.bat 文件,输入下面脚本
d:
::格式化时间,如20210808
set "Ymd=%date:~,4%%date:~5,2%%date:~8,2%"
::新建文件夹
md D:\备份mysql\%ymd%
::循环数据库,备份数据库到指定目录,打印日志到指定文件
for %%I in (mybatis,mybatis-plus) do mysqldump -utest -h1.*.*.107 -p123456 -P3306 %%I > D:\备份mysql\%ymd%\%%I.sql 2> D:\备份mysql\%ymd%\error.log
备份成功,结果如下
②、添加定时任务
在 window 搜索中搜索管理工具,或者任务计划,打开任务计划添加定时任务
右键任务计划程序库创建任务