需求背景
为了防止mysql数据因为各种意外情况导致数据丢失,定期对数据库做个备份还是非常有必要的。本文记录一下mysql的备份过程以及通过AI聊天助手写出一个备份数据库的shell脚本。
备份步骤
通过mysqldump -uroot -p[数据库密码] [数据库名称] > [sql文件保存地址], 前提是要已经安装好mysqldump这个命令。
导出的sql文件包含了该数据库的所有表结构和表里的数据。
1. 执行mysqldump命令
我这里是登录远程服务器执行,也可以在本地执行,加上-h[服务器ip地址]就行,我由于本地电脑没有mysqldump,就直接登录服务器执行了
mysqldump -uroot -p123456 myblog > /data/bak/mysql/myblog_bak_20231107.sql
2. 将导出的sql文件传回本地,
为了防止服务器文件丢失,最好将sql文件传回来。在本地电脑执行以下命令
scp -i ${ssh_key} ${user}@${remote_ip}:/data/bak/mysql/nblog_bak_${date}.sql ${local_backup_dir}
其中scp命令专门用于与远程服务器传输文件,格式如下
scp [待传输的文件地址] [需要传输至的目的地]
# 例如,将远程服务器的/data/files/abc.txt文件传输回本地的/Users/apple/Documents/文件夹
scp root@xxx.xx.xx.xxx:/data/files/abc.txt /Users/apple/Documents/
# 将本地的/Users/apple/Documents/a.png文件传输至远程服务器的/data/tmp/文件夹
scp /Users/apple/Documents/a.png root@xxx.xx.xx.xxx:/data/tmp/
# 上述操作均需要输入远程服务器的登录密码,如果想使用rsa私钥的话,可以加上-i [id_rsa文件地址]
scp -i ~/.ssh/aliyun/id_rsa Users/apple/Documents/a.png root@xxx.xx.xx.xxx:/data/tmp/
# 如果要传输文件夹,加上-r即可
scp -r -i ~/.ssh/aliyun/id_rsa /Users/apple/Documents/testdir/ root@xxx.xx.xx.xxx:/data/tmp/
到此为至,数据库文件已经安全地备份到我们自己的电脑上了。接下去如果某天服务器直接没了,想要恢复数据库,继续看下面步骤
3. 恢复数据库
#登录正常的mysql的服务器,执行以下命令
mysql -uroot -p123456 myblog < /data/bak/mysql/myblog_bak_20231107.sql
这样就恢复好了
写成shell脚本
为了方便每次备份的时候可以直接点一下执行按钮就自动备份好,写一个shell脚本是很有必要的。由于不太熟悉shell脚本,让AI聊天助手帮我写一下吧,下面是脚本。
提示:下面的各种变量自行替换···
#!/bin/bash
# 远程服务器IP地址
remote_ip="xxx.xx.xx.xxx"
# SSH私钥路径
ssh_key="/Users/apple/.ssh/aliyun/id_rsa"
#服务器登录用户名
user="serveruser"
# 远程服务器数据库用户名和密码
db_user="dbuser"
db_password="12345678"
# 本地保存备份文件的文件夹路径
local_backup_dir="/Users/apple/Documents/bak/mysql/"
# 当前日期(用于sql文件名生成)
date=$(date +"%Y%m%d")
echo "连接远程服务器 ${remote_ip} ..."
ssh -i ${ssh_key} ${user}@${remote_ip} <<EOF
echo "开始导出数据库 ..."
mysqldump -u ${db_user} -p${db_password} myblog > /data/bak/mysql/myblog_bak_${date}.sql
if [ $? -ne 0 ]; then
echo "数据库导出失败"
exit 1
else
echo "数据库导出成功"
fi
EOF
# 判断数据库是否导出成功
if [ $? -ne 0 ]; then
echo "数据库导出失败,文件传输操作已终止"
exit 1
fi
echo "开始传输文件 ..."
scp -i ${ssh_key} ${user}@${remote_ip}:/data/bak/mysql/nblog_bak_${date}.sql ${local_backup_dir}
if [ $? -ne 0 ]; then
echo "文件传输失败"
exit 1
else
echo "文件传输成功"
fi