Linux 配置 MySQL 定时自动备份到另一台服务器

本文介绍了如何在Linux环境中配置MySQL数据库每天自动备份,并通过SSH同步到另一台服务器,实现简单数据容灾。主要步骤包括:配置SSH无密登录,编写自动备份SH脚本,以及设置Cron定时任务执行该脚本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

此方案可使一台服务器上的 MySQL 中的所有数据库每天 0 点自动转储为 .sql 文件,然后将文件同步到另一台服务器上,可以作为一个简单的数据容灾。


一、配置服务器 ssh

从一台服务器同步文件到另一台服务器,需要使两台服务器之间建立 ssh 连接,不然每次执行备份的时候你还要半夜爬起来去输入服务器密码。

ssh-keygen -t rsa

运行这句,一直敲击回车,会在 /root/.ssh 目录下生成两个文件,我使用的是 xftp 查看的文件,这个 .ssh 文件夹是隐藏文件夹,所以 xftp 下面看不到,你要手动输入地址 /root/.ssh 就可以进去了,把 id_rsa.pub 里的内容全选复制。
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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


二、编写自动备份 sh 文件

在数据库所在的服务器新建一个 sh 文件,放在哪里、怎样命名都随意(此处注意!!!不要使用 xftp 右键新建文件来编写 sh 文件,那样编码会出问题,比如新建的文件名后面会多出一个问号“?”,使用命令行vim或vi来新建

mkdir mysqlAutoBackupTo24
cd mysqlAutoBackupTo24
mkdir backup
vim AutoBackup.sh

在这里插入图片描述
我建立的文件夹是这样的

在这里插入图片描述

AutoBackup.sh 里面的内容

#下面生成的sql在本服务器存放的文件夹,就是我上面建立的
BACKUP=/data/mysqlAutoBackupTo24/backup
#当前时间,用来命名sql文件
DATETIME=$(date +%Y-%m-%d)
echo "===备份开始==="
echo "备份文件存放于${BACKUP}/$DATABASE-$DATETIME.sql"
#生成sql文件,命名
DATABASE=dbBackup
echo $DATABASE-$DATETIME
#mysqldump -h localhost -u${DB_USER} -p${DB_PW} --all-databases > ${BACKUP}/$DATABASE-$DATETIME.sql
mysqldump -h 11.11.111.28 -uroot -proot --databases dba dbb > ${BACKUP}/$DATABASE-$DATETIME.sql
echo "===导出成功,开始传输==="
#将sql文件从服务器28备份到服务器24自己建立的文件夹/data/mysqlAutoBackupFrom28下面
scp -P 122 $DATABASE-$DATETIME.sql root@11.11.11.24:/data/mysqlAutoBackupFrom28
#删除备份目录
#rm -rf ${BACKUP}/$DATETIME
#删除7天前备份的数据,自行更改
#find $BACKUP -mtime +7 -name "*.sql" -exec rm -rf {} \;
echo "===数据库备份到服务器成功==="

mysqldump 的 -h 后面写当前服务器的 IP,也就是11.11.111.28,不要写 localhost,因为如果是离线安装的 mysql 可能没有 mysqld.socket ,导致连接失败。

--databases dba dbb 的意思是指定备份 dba 和 dbb 这个两个数据库,指定多个数据库要加 --databases ,数据库用空格隔开,上面一句注释掉的是 --all-databases ,意思是备份全部数据库,但是我的报错,不知道为什么。你们可以试一下。

scp -P 122 是指定 ssh 端口,不指定默认为 22,root 是目标服务器11.11.11.24 的用户名

下面我们运行一下这个 sh 看看效果,cd 到你的 sh 存放的文件夹 sh AutoBackup.sh,首次进行 ssh 连接要输入一个 yes 回车,然后去目标服务器 24 查看,sql 文件已经同步过去。

在这里插入图片描述
在这里插入图片描述


三、设置定时自动执行

上面的测试没有问题,下面我们设定一个每天 0 点自动执行 sh 脚本,就可以失效每天的自动同步。

首先赋予要执行的 shell 脚本权限,给高一点,不然没法自动执行

chmod 777 /data/mysqlAutoBackupTo24/AutoBackup.sh

输入下面语句,vim 会打开一个文件

crontab -e

里面这样写,保存,前面的 02 00 * * * 是 cron 表达式,代表每天 00:02 执行 /data/mysqlAutoBackupTo24/AutoBackup.sh,之所以设置 00:02 是因为避免服务器在 0 点的时候有其他数据同步任务,所以晚一点。cron 表达式的语法你们可以学一下。

02 00 * * * sh /data/mysqlAutoBackupTo24/AutoBackup.sh

在这里插入图片描述

保险起见再刷新一下配置

service crond reload

总结

感谢https://blog.csdn.net/qq_33966519/article/details/103761673这篇文章,Windows 的 MySQL 备份要编写一个 bat 文件,在系统自带的计划任务里设置定时,后面研究研究再写吧。

在Java中实现数据库自动备份并将其传输到另一台服务器,可以按照以下步骤进行: 1. **数据库备份**: - 使用数据库提供的命令行工具进行备份。例如,MySQL可以使用`mysqldump`工具。 2. **文件传输**: - 使用Java的`java.nio`包或第三方库如`Apache Commons Net`来实现FTP或SCP文件传输。 3. **定时任务**: - 使用操作系统的定时任务(如Linux的`cron`)或Java的`ScheduledExecutorService`来定时执行备份和传输任务。 以下是一个简单的示例代码,展示了如何使用Java实现MySQL数据库的自动备份并通过FTP传输到另一台服务器: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class DatabaseBackup { public static void main(String[] args) { ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); scheduler.scheduleAtFixedRate(new BackupTask(), 0, 24, TimeUnit.HOURS); } static class BackupTask implements Runnable { @Override public void run() { try { // 数据库备份 ProcessBuilder builder = new ProcessBuilder( "mysqldump", "-u", "username", "-p", "password", "databaseName"); Process process = builder.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); FileOutputStream fos = new FileOutputStream("backup.sql"); String line; while ((line = reader.readLine()) != null) { fos.write(line.getBytes()); } fos.close(); // 文件传输 FTPClient ftpClient = new FTPClient(); ftpClient.connect("ftp.server.com"); ftpClient.login("ftpUser", "ftpPassword"); ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); File localFile = new File("backup.sql"); FileInputStream inputStream = new FileInputStream(localFile); ftpClient.storeFile("backup.sql", inputStream); inputStream.close(); ftpClient.logout(); ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } } ``` ### 说明: 1. **数据库备份**: - 使用`ProcessBuilder`调用`mysqldump`命令进行数据库备份。 - 将备份文件写入到本地文件系统。 2. **文件传输**: - 使用`FTPClient`连接到FTP服务器并登录。 - 将备份文件上传到服务器。 3. **定时任务**: - 使用`ScheduledExecutorService`每天执行一次备份和传输任务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁华尽头满是殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值