当前位置:首页 > 问答 > 正文

怎么一步步搞定MySQL数据备份,定时自动跑起来的那些事儿

咱们得搞清楚为啥要备份数据库,想象一下,你的网站或者应用跑了很久,里面存了好多用户信息、订单数据,突然有一天,服务器硬盘坏了,或者哪个程序员小哥不小心写了个烂查询把重要数据全删了,这时候要是没备份,那真是叫天天不应,叫地地不灵了,备份就是个“保险”,平时用不着,但出了事能救命。

我们一步步来操作,这里主要讲两种简单又实用的方法:一种是用MySQL自带的小工具mysqldump,另一种是更自动化的方式,写个脚本然后让系统定时去跑。

第一步:找到你的“工具箱”——认识mysqldump

mysqldump是MySQL官方给的备份工具,它就藏在你的MySQL安装目录里,你不用管它具体怎么运作,只要知道它能帮你把整个数据库,或者指定的某个数据库、某几张表,变成一个包含所有SQL语句的文本文件,万一数据没了,你就能用这个文件像放录像一样把数据原样恢复回来。

第二步:动手试试手动备份(先学会走,再学跑)

在开始自动化之前,咱们先手动成功备份一次,这样心里有底,你需要打开你服务器上的命令行窗口(比如Linux的终端,或者Windows的命令提示符)。

一个最基础的备份整个MySQL里所有数据库的命令长得像这样(根据[MySQL 8.0 Reference Manual]的描述):

mysqldump -u [用户名] -p[密码] --all-databases > backup.sql

注意:

  • -u后面跟着的是有权限备份数据的用户名,比如root
  • -p和你的密码之间不能有空格,比如密码是123456,就写-p123456,为了安全,你也可以只写-p,然后回车后再输入密码,这样密码就不会显示在屏幕上。
  • --all-databases意思是备份所有数据库,如果你只想备份其中一个叫my_website的数据库,那就把--all-databases换成--databases my_website
  • 那个 > 符号是重定向符,意思是把mysqldump工具输出的内容,不是显示在屏幕上,而是保存到后面跟着的文件里,这里就是backup.sql,这个文件会创建在你当前所在的目录下。

你运行完命令后,如果没报错,当前目录下就会多出一个backup.sql文件,你可以用文本编辑器打开它看看,里面全是一堆SQL的创建表和插入数据的语句,这就说明你备份成功了!

第三步:恢复数据试试(验证备份有没有用)

备份的文件好不好使,得恢复一下才知道,咱们可以找个测试环境,或者临时创建一个新数据库来练手,恢复的命令用的是MySQL的客户端mysql(根据[MySQL 8.0 Reference Manual]关于mysql客户端的说明):

mysql -u [用户名] -p[密码] [要恢复到的数据库名] < backup.sql

注意:

  • 如果备份的是整个数据库(用了--all-databases),那你恢复时就不用指定数据库名了。
  • 那个 < 符号和备份时相反,意思是把backup.sql文件里的内容,“喂”给mysql命令去执行。

恢复成功的话,数据就应该都回来了,这一步很重要,确保了你的备份不是个摆设。

第四步:让备份自己“跑起来”——搞定时任务

总不能天天手动去执行命令吧,太麻烦了,我们的目标是让系统在半夜没人用的时候自动备份,这就需要用到系统的“定时任务”功能,在Linux系统里,这个工具叫cron;在Windows里,叫“任务计划程序”,这里以更常见的Linux的cron为例。

  1. 写个备份脚本:先创建一个文本文件,比如叫mysql_backup.sh,用文本编辑器打开它,把刚才的手动命令写进去,还可以加些“花样”:

    #!/bin/bash
    # 设置用户名、密码和备份目录(根据你的实际情况修改)
    USER="你的数据库用户名"
    PASS="你的数据库密码"
    BACKUP_DIR="/home/backups/mysql"
    # 创建备份目录(如果不存在的话)
    mkdir -p $BACKUP_DIR
    # 生成带日期的备份文件名,backup-20231027.sql
    BACKUP_FILE="$BACKUP_DIR/backup-$(date +%Y%m%d).sql"
    # 执行备份命令
    mysqldump -u$USER -p$PASS --all-databases > $BACKUP_FILE
    # (可选) 删除太久远的备份,比如只保留最近7天的
    find $BACKUP_DIR -name "backup-*.sql" -mtime +7 -delete

    这个脚本做了几件事:定义变量、创建备份存放文件夹、用当前日期给备份文件取名(这样每天备份就不会覆盖了)、执行备份,最后还贴心地加了一句删除7天前旧备份的命令,防止硬盘被塞满。

  2. 给脚本“开权限”:在终端里,进入脚本所在目录,运行chmod +x mysql_backup.sh,这样系统才允许执行这个脚本,你可以先手动运行一下脚本./mysql_backup.sh,看看是否能在指定目录生成备份文件,确保脚本没问题。

  3. 设置定时任务:在终端输入crontab -e命令,会打开一个编辑器,在里面添加一行(根据[crontab guru]这个常用解释工具的理解,这表示每天凌晨2点执行):

    0 2 * * * /home/your_username/mysql_backup.sh

    这行命令的五个号分别代表分、时、日、月、星期。0 2 * * *的意思就是“每天凌晨2点整”,后面的路径是你刚才那个mysql_backup.sh脚本的完整路径。

保存退出后,定时任务就设好了,从此以后,只要你的服务器开着,它就会每天凌晨2点乖乖地帮你备份数据库。

最后啰嗦几句重要的:

  • 安全第一:脚本里直接写密码有点危险,如果服务器被别人看到了就不安全,更安全的做法是把密码写在另一个只有管理员能看的配置文件里,然后在脚本里读取,或者使用MySQL 8.0支持的登录路径(login-path)功能(根据[MySQL 8.0 Reference Manual]关于mysql-config-editor的说明)。
  • 别把鸡蛋放一个篮子:备份文件一定一定一定不要只放在服务器本地!万一整个服务器都宕机或者被入侵了,本地备份也一起玩完,要想办法把备份文件自动传送到另一个地方,比如另一台服务器、网盘,或者对象存储(比如阿里云OSS、腾讯云COS这些)。
  • 定期检查:别以为设置了定时任务就一劳永逸,最好每个月抽个时间,去看看备份目录里是不是真的有文件在按时生成,并且抽查一下恢复流程是否顺畅。

好了,以上就是从手动到自动搞定MySQL备份的整个流程,核心就是先用mysqldump命令把备份做通,然后写个脚本把命令包装起来,最后利用系统的定时任务功能让脚本自动执行,整个过程不需要太深的技术背景,照着步骤来,耐心点,你肯定能搞定。

怎么一步步搞定MySQL数据备份,定时自动跑起来的那些事儿