MySQL将数据库从一台服务器备份到另一台服务器

项目中常需将服务器数据备份到新数据库,直接远程备份再上传不可行。可使用scp命令直接复制data目录到另一台服务器,文中介绍了scp命令复制文件、目录的格式,指定端口的方法,以及从远程复制到本地、从本地上传到远程的实例,还提及复制后需修改文件权限和表结构。

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

我们在做项目的时候可能会遇到这种需求要将之前的服务器上的数据备份到一个新的数据库。我就遇到这种情况,如果将远程服务器的数据库备份到本地然后又从本地上传到另一台服务器,这样显然是不行的,因为一个项目的数据库是很大的,这样要弄到猴年马月。有一个简单的方法就是使用scp命令直接将data目录复制到另一台。

scp命令的实际应用概述:
(1) 复制文件:

命令格式:

scp local_file remote_username@remote_ip:remote_folder

或者

scp local_file remote_username@remote_ip:remote_file

或者

scp local_file remote_ip:remote_folder

或者

scp local_file remote_ip:remote_file

第1,2个指定了用户名,命令执行后需要输入用户密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名

第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名

(2) 复制目录:

命令格式:

scp -r local_folder remote_username@remote_ip:remote_folder

或者

scp -r local_folder remote_ip:remote_folder

第1个指定了用户名,命令执行后需要输入用户密码;

第2个没有指定用户名,命令执行后需要输入用户名和密码;

指定端口:

scp -P port local_folder remote_ip:remote_folder

从远程服务器复制到本地服务器:

从远程复制到本地的scp命令与上面的命令雷同,只要将从本地复制到远程的命令后面2个参数互换顺序就行了。

实例1:从远处复制文件到本地目录

命令:

scp root@192.168.120.204:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/

实例1:从远处复制文件到本地目录

命令:

scp root@192.168.120.204:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/

说明:

从192.168.120.204机器上的/opt/soft/的目录中下载nginx-0.5.38.tar.gz 文件到本地/opt/soft/目录中

实例2:从远处复制到本地

命令:

scp -r root@192.168.120.204:/opt/soft/mongodb /opt/soft/

说明:

从192.168.120.204机器上的/opt/soft/中下载mongodb 目录到本地的/opt/soft/目录来。

实例3:上传本地文件到远程机器指定目录

命令:

scp /opt/soft/nginx-0.5.38.tar.gz root@192.168.120.204:/opt/soft/scptest

说明:

复制本地opt/soft/目录下的文件nginx-0.5.38.tar.gz 到远程机器192.168.120.204的opt/soft/scptest目录

实例4:上传本地目录到远程机器指定目录

命令:

scp -r /opt/soft/mongodb root@192.168.120.204:/opt/soft/scptest

如果只将data目录下的数据库复制到另一台,一定要将下面这个文件复制过去,因为这个文件种保存的是数据库表的数据。
在这里插入图片描述
需要注意的是,我们将data目录复制过去,需要修改文件的所在的组,它的拥有者和权限。因为我们复制过去的,默认是属于root用户的。这样我们不能以mysql的用户去操作它。
在这里插入图片描述
如上图所示,表结构也要全部修改!!!

<think>嗯,用户想了解如何用Shell脚本定时备份多个MySQL数据库并传输到另一台服务器。首先,我需要理清整个流程的步骤,确保每个环节都覆盖到。 首先,备份MySQL数据库通常使用mysqldump命令,对吧?那需要确认用户是否有权限访问所有要备份数据库,并且知道数据库的登录凭证。可能需要使用用户名和密码,或者使用配置文件来避免在脚本中硬编码密码,这样更安全。 接下来是备份多个数据库的问题。用户可能有多个数据库需要备份,所以需要遍历这些数据库名称。可以用一个数组或者从文件中读取数据库列表。然后循环处理每个数据库,生成对应的备份文件。文件名最好包含日期时间,方便管理和恢复。 然后,压缩备份文件可以节省空间,特别是当数据库较大时。使用tar或者gzip来压缩应该没问题,可能需要考虑压缩速度和效率,但通常gzip足够用了。 传输到另一台服务器,通常用scp或者rsync。scp比较简单,但rsync可能更适合增量备份,不过用户的需求是定时全量备份,所以scp可能更直接。需要确保SSH密钥已经配置好,避免手动输入密码。这里可能需要提醒用户设置免密登录,比如使用ssh-keygen和ssh-copy-id。 定时任务的话,crontab是常用的工具。需要编辑crontab条目,设置每天或每小时执行脚本。要注意脚本的执行权限,以及日志记录,方便排查问题。 另外,可能还需要考虑备份文件的保留策略,比如只保留最近7天的备份,避免磁盘空间被占满。这可以通过在脚本中添加删除旧文件的命令来实现。 安全性方面,提醒用户不要在脚本中明文存储密码,而是使用MySQL的配置文件,并设置合适的权限。比如,将密码存储在.my.cnf文件中,并设置该文件仅对所有者可读。 可能用户没有提到的点,比如备份的完整性验证,传输后的文件校验,或者是否需要进行加密传输。不过根据问题描述,可能用户更关注基本流程,这些高级步骤可以作为扩展建议。 最后,整个脚本的结构大概是这样的:获取数据库列表,逐个备份,压缩,传输,清理旧文件。然后设置crontab任务。 需要测试脚本的每个部分是否正常执行,比如mysqldump是否成功,压缩是否完成,scp是否传输无误。添加错误处理,比如如果某个数据库备份失败,是否继续处理下一个,或者记录错误信息。 可能还需要记录日志,方便后续查看备份是否成功,或者在出现问题时排查原因。可以在脚本中通过重定向输出到日志文件,或者使用logger命令。 总结步骤: 1. 准备数据库列表和MySQL凭证。 2. 使用mysqldump备份每个数据库。 3. 压缩备份文件。 4. 使用scp传输到远程服务器。 5. 删除本地和远程的旧备份文件。 6. 设置crontab定时任务。 7. 考虑安全性和错误处理。 现在需要把这些步骤转化成具体的Shell脚本,并给出详细的说明,确保用户能够理解每一步的作用,并根据自己的环境进行配置。</think>以下是一个使用 Shell 脚本定时备份多个 MySQL 数据库并传输到远程服务器的完整方案,包含详细步骤和注意事项: --- ### **一、脚本实现步骤** #### 1. 创建备份脚本 `mysql_backup.sh` ```bash #!/bin/bash # ---------- 配置参数 ---------- # MySQL 连接配置(建议将密码存储在 ~/.my.cnf 避免明文) MYSQL_USER="root" MYSQL_PASS="your_password" # 要备份数据库列表 DATABASES=("db1" "db2" "db3") # 备份存储路径 LOCAL_BACKUP_DIR="/opt/mysql_backups" # 远程服务器配置 REMOTE_USER="remote_user" REMOTE_IP="192.168.1.100" REMOTE_DIR="/backup/mysql" # 保留最近 7 天的备份 DAYS_TO_KEEP=7 # --------- 开始备份流程 --------- # 创建本地备份目录 mkdir -p $LOCAL_BACKUP_DIR # 生成日期标记 (e.g. 20231001-1530) TIMESTAMP=$(date +%Y%m%d-%H%M%S) # 循环备份每个数据库 for DB_NAME in "${DATABASES[@]}"; do BACKUP_FILE="$LOCAL_BACKUP_DIR/${DB_NAME}_${TIMESTAMP}.sql" # 使用 mysqldump 备份数据库 mysqldump --user=$MYSQL_USER --password=$MYSQL_PASS --single-transaction $DB_NAME > $BACKUP_FILE # 检查备份是否成功 if [ $? -ne 0 ]; then echo "[ERROR] 备份失败: $DB_NAME @ $(date)" >> $LOCAL_BACKUP_DIR/backup.log exit 1 fi done # -- tar -zcvf $LOCAL_BACKUP_DIR/backup_$TIMESTAMP.tar.gz $LOCAL_BACKUP_DIR/*.sql rm -f $LOCAL_BACKUP_DIR/*.sql # 删除临时 SQL 文件 # --------- 传输到远程服务器 --------- scp $LOCAL_BACKUP_DIR/backup_$TIMESTAMP.tar.gz $REMOTE_USER@$REMOTE_IP:$REMOTE_DIR # ----- 清理旧备份(本地和远程)----- # 本地清理 find $LOCAL_BACKUP_DIR -type f -name "*.tar.gz" -mtime +$DAYS_TO_KEEP -exec rm {} \; # 远程清理(需提前配置 SSH 免密登录) ssh $REMOTE_USER@$REMOTE_IP "find $REMOTE_DIR -name '*.tar.gz' -mtime +$DAYS_TO_KEEP -exec rm {} \;" # 记录日志 echo "[SUCCESS] 备份完成 @ $(date)" >> $LOCAL_BACKUP_DIR/backup.log ``` --- ### **二、关键配置说明** 1. **MySQL 安全认证** **推荐** 将密码存储在 `~/.my.cnf` 文件(权限设为 600): ```ini [client] user = root password = your_password ``` 脚本中可简化为直接使用 `mysqldump $DB_NAME`。 2. **SSH 免密登录配置** 执行以下命令生成密钥并上传到远程服务器: ```bash ssh-keygen -t rsa ssh-copy-id -i ~/.ssh/id_rsa.pub $REMOTE_USER@$REMOTE_IP ``` 3. **备份保留策略** 通过 `find -mtime +7` 删除 7 天前的备份,可根据需求调整 `DAYS_TO_KEEP`。 --- ### **三、设置定时任务** 1. **赋予脚本执行权限** ```bash chmod +x /path/to/mysql_backup.sh ``` 2. **配置 Crontab 定时任务** ```bash crontab -e ``` 添加以下内容(每天凌晨 2 点执行): ```bash 0 2 * * * /path/to/mysql_backup.sh >/dev/null 2>&1 ``` --- ### **四、增强建议** 1. **备份完整性检查** 传输后添加校验命令(如 `md5sum`)比对文件哈希值。 2. **异常通知机制** 在脚本中添加邮件/Slack 通知(例如使用 `mail` 命令或 `curl` 调用 Webhook)。 3. **增量备份优化** 如需节省带宽,可将 `scp` 替换为 `rsync` 进行差异同步。 --- ### **五、常见问题** 1. **权限不足** 确保 MySQL 用户有 `SELECT` 和 `LOCK TABLES` 权限,远程目录可写。 2. **磁盘空间不足** 监控本地和远程服务器的存储空间。 3. **网络中断** 使用 `scp -C` 启用压缩传输,或在脚本中添加重试逻辑。 --- 通过以上步骤,即可实现自动化、安全的 MySQL 数据库定时备份与跨服务器同步。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值