centos实现mysql定时备份(单机)
创建备份脚本:
首先,我们需要创建一个 Shell 脚本来执行 MySQL 数据库的备份操作。我们可以将备份脚本命名为 backup_mysql.sh。以下是 backup_mysql.sh 的内容:
#!/bin/bash # 数据库连接信息 DB_HOST="localhost" DB_USER="root" DB_PASS="123456" DB_NAME="ceshi" DB_PORT="3341" # 备份目录 BACKUP_DIR="/home/mysql/back" # 备份文件名,包含日期和时间 BACKUP_FILE="${BACKUP_DIR}/backup_$(date +'%Y%m%d_%H%M%S').sql" # mysqldump 命令,备份数据库到指定文件 /usr/bin/mysqldump --opt --single-transaction --default-character-set=utf8 --skip-extended-insert -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_FILE # 删除过期备份文件,只保留最近 30 天的备份 find $BACKUP_DIR -type f -name "backup_*.sql" -mtime +30 -exec rm {} \;
参数说明
说明一下上面的参数
- 如果你的mysql端口是3306,那么就可以不指定端口,因为默认就是3306,这里之所以这么写为了安全
- 使用
whereis mysqldump
来获取你的mysqldump,一般是在/usr/bin/mysqldump
--opt
:如果有这个参数表示同时激活了mysqldump命令的quick,add-drop-table,add-locks,extended-insert,lock-tables参数,它可以给出很快的转储操作并产生一个可以很快装入MySQL服务器的转储文件。当备份大表时,这个参数可以防止占用过多内存--single-transaction
设置事务的隔离级别为可重复读,然后备份的时候开启事务,这样能保证在一个事务中所有相同的查询读取到同样的数据。注意,这个参数只对支持事务的引擎有效,如果有MyISAM
的数据表,并不能保证数据一致性- 这里如果你导出的不是上面的表,而是全表可以替换为参数
-A
--skip-extended-insert
默认情况下,mysqldump 命令在导出 SQL 文件时会将多个 INSERT 语句合并成一批进行导出,以提高导入性能。如果你希望将每个 INSERT 语句单独导出,即一条一条导出,可以使用 --skip-extended-insert 参数来实现。使用 --skip-extended-insert 参数后,mysqldump 会将每个 INSERT 语句单独导出,而不会合并为一批。这样导出的 SQL 文件会比较大,但可以确保每条数据都以单独的 INSERT 语句形式保存,方便阅读和处理。
对于上面的-
--skip-extended-insert
如果没加的话,导出的sql文件是相对较小的,但是如果某一个表中的数据过大,在Navicat中导入就会报错ERR] 2006 - Server has gone away
,解决办法就是如将wait_timeout 和 max_allowed_packet设置大一点
定时任务实现
- 确定脚本位于什么位置下:到达脚本位置,执行
pwd
命令 - 执行以下命令
crontab -e
- 编写定时任务命令
0 0 * * * /bin/bash /path/to/backup_mysql.sh
这将在每天的 00:00 执行我们之前创建的 backup_mysql.sh 脚本,并实现自动备份数据库。