Linux环境下MySQL数据库定时备份和还原

2026年01月21日/ 浏览 11

一、手动备份

1、首先创建备份路径(mkdir /var/bak)

2、使用命令进行实现数据库备份

备份单个数据库的数据命令

mysqldump -uroot -p --databases vc_rubbish_platfrom> /var/bak/vc_rubbish_plarform.sql

报错:

解决mysqldump:command not found问题

ln -fs /usr/local/mysql/mysql-8.0/bin/mysqldump /usr/bin

再次执行并输入密码

mysqldump -uroot -p --databases vc_rubbish_platfrom> /var/bak/vc_rubbish_plarform.sql

查看备份文件是否备份成功

3、使用命令还原备份

mysql -uroot -p < /var/bak/vc_rubbish_plarform.sql

二、定时备份

1、找到合适位置创建文件夹,放置脚本文件和备份数据

创建路径

mkdir -p /usr/local/msyql/mysql_backup

进入创建的路径

cd /usr/local/mysql/mysql_backup

创建脚本并填充数据

vi mysql_backup.sh

2、mysql_backup.sh脚本的内容,执行数据备份

#!/bin/bash #================基础参数=============== user="root" password="密码" port="3306" #备份库名列表,括号内多个数据库空格隔开 db_name_array=("vc_rubbish_platform" "sys") #备份位置(若不存在,会自动创建) datafile_path="/usr/local/mysql/backup/database_bak" #mysqlDump的绝对位置,基本为mysql安装路径 mysqlDump_path="/usr/bin/mysqldump" #是否删除.sql文件(包含子目录): ON开启,其他字符不开启 rf_switch="ON" #数据保留天数(按文件修改时间计算) expire_day=10 #================非开发人员勿改================ #备份最终路径 bak_path="${datafile_path}/${db_name}" #错误日志文件名称 error_log="${bak_path}/${db_name}_error.log" #================备份执行指令================ #判断文件夹,不存在则创建 if [ ! -d "$bak_path" ] then mkdir -p ${bak_path} echo "已创建文件夹${bak_path}" fi #判断mysql是否开启 checkPort=`lsof -i:${port} | wc -l` if [ "$checkPort" -gt "0" ] then echo "mysql 已启动" else echo "mysql 未启动无法进行备份" echo "mysql 未启动无法进行备份" > $error_log fi #执行备份 for db_name in ${db_name_array[*]} do ${mysqlDump_path} -u${user} -p${password} --databases $db_name | gzip > ${bak_path}"/"$db_name$_$(date +%Y%m%d_%H%M%S).sql.gz 2>>${error_log} done #删除过期文件 if [ $rf_switch == "ON" ] then find ${bak_path} -name "*.sql" -mtime +${expire_day} | xargs rm -f fi

3、脚本增加权限

chmod +x ./mysql_backup.sh

4、测试脚本运行

sh ./mysql_backup.sh

查看log日志

vi vc_rubbish_platform_error.log

因为mysql自5.7版本开始,考虑到mysql的安全性而更改对保护机制,在mysqldump备份数据库对时候不能直接在命令行上书写数据库的密码

解决方法修改mysql配置文件m /etc/my.conf

加入下面内容:

[mysqldump] user=root password=你的密码

修改mysql_backup.sh脚本文件

${mysqlDump_path} --defaults-extra-file=/etc/my.cnf --databases $db_name | gzip > ${bak_path}"/"$db_name$_$(date +%Y%m%d_%H%M%S).sql.gz 2>>${error_log}

测试脚本并查看

5、恢复脚本执行的备份文件

恢复gz备份文件

#1.解压gz文件

#直接解压默认删除原压缩文件

gunzip /usr/local/mysql/backup/database_bak/vc_rubbish_platform20220530_113928.sql.gz

进入MySQL

mysql -u root -p

#3.恢复备份数据

source /usr/local/mysql/backup/database_bak/vc_rubbish_platform_20220530_115614.sql

6、linux定时执行脚本

查看crontab的定时任务

crontab -l

创建crontab的定时任务

#编辑crontab定时任务

crontab -e #可以先用这个测试,每一分钟执行一次。 */1 * * * * /usr/local/mysql/mysql_backup/mysql_backup.sh #每天凌晨1点执行 0 1 * * * /usr/local/mysql/mysql_backup/mysql_backup.sh

查看

7、crontab定时时间

例如:

0 */2 * * * /sbin/service httpd restart 意思是每两个小时重启一次apache 50 7 * * * /sbin/service sshd start 意思是每天7:50开启ssh服务 50 22 * * * /sbin/service sshd stop 意思是每天22:50关闭ssh服务 0 0 1,15 * * fsck /home 每月1号和15号检查/home 磁盘 1 * * * * /home/bruce/backup 每小时的第一分执行 /home/bruce/backup这个文件 00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \; 每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。 30 6 */10 * * ls 意思是每月的1、11、21、31日是的6:30执行一次ls命令

三、Mysql数据库自动备份到另一台服务器

1、配置服务器 ssh

ssh-keygen -t rsa

运行这句,一直敲击回车,会在当前目录下生成两个文件,我使用的是 xftp 查看的文件,把 ha.pub 里的内容全选复制。

来到目标服务器,也是进入 /root/.ssh 文件夹,把刚刚复制的内容粘贴进 authorized_keys 的尾部(authorized_keys 可能没有,自己新建,里面可以有多个 key,互不影响,换一行粘贴就行了)

保存,这样我们两台服务器的 ssh 连接就建立好了。

2、修改自动备份 sh 文件

将mysql_backup.sh中添加备份服务器

${mysqlDump_path} --defaults-extra-file=/etc/my.cnf --databases $db_name | gzip > ${bak_path}"/"$db_name$_$(date +%Y%m%d_%H).sql.gz 2>>${error_log}

sshpass -p 服务器密码 scp ${bak_path}$db_name$_$(date +%Y%m%d_%H).sql.gz root@42.192.143.116:/var/backup/mysql

执行.sh文件

报错

编译安装sshpass

# wget https://nchc.dl.sourceforge.net/project/sshpass/sshpass/1.06/sshpass-1.06.tar.gz # tar zxf sshpass-1.06.tar.gz # cd sshpass-1.06 # ./configure --prefix=/usr/local/ # make && make install

安装完成后继续执行.sh文件

3、查看备份服务器是否备份成功

cd /var/backup/mysql

picture loss