mysqldump:
#完全备份
mysqldump -uroot -p123456 -A -F -E -R --triggers --single-transaction --source-data=2 --flush-privileges --default-character-set=utf8mb4 --hex-blob > ${BACKUP}/fullbak_${BACKUP_TIME}.sql
#参数解释
-A: (--all-databases) 导出所有数据库。
-F: (--flush-logs) 在开始导出前刷新 MySQL 的日志文件(例如二进制日志)。
-E: (--events) 导出事件调度器中的事件。
-R: (--routines) 导出存储过程和函数。
--triggers: 导出触发器。默认情况下会导出触发器,但明确指定可以确保其被包含。
--single-transaction: 设置事务隔离级别为 REPEATABLE READ 并发送 START TRANSACTION SQL 语句给服务器。这使得导出的数据是一致的快照,而不需要锁定表。
--source-data=2: (--source-data) 在输出文件中包含创建转储文件的指令。值为 2 表示在每条语句后添加注释,指示该语句对应的原始位置。
--flush-privileges: 在导出数据后添加一条 FLUSH PRIVILEGES 语句。这对于导出 MySQL 用户权限信息很有用。
--default-character-set=utf8: 设置默认字符集为 utf8。这对于正确处理多语言字符很重要。
--hex-blob: 将 BLOB(Binary Large Object)字段值以十六进制格式导出。这样可以避免某些特殊字符导致的问题。特定数据库备份:
#!/bin/bash
TIME=`date +%F_%H_%M_%S`
DIR=/backup
DB=hellodb
PASS=123456
[ -d $DIR ] || mkdir $DIR
mysqldump -uroot -p"$PASS" -F -E -R --triggers --single-transaction --source-data=2 --default-character-set=utf8mb4 -q -B $DB | gzip > ${DIR}/${DB}_${TIME}.sql.gz分库备份:
#!/bin/bash
# 设置时间和备份目录
TIME=$(date +%F_%H_%M_%S)
DIR="/backup"
PASS="123456"
if [ ! -d "$DIR" ]; then
mkdir -p "$DIR"
fi
# 获取所有数据库名(排除掉名称中包含'schema'的数据库)
DATABASES=$(mysql -uroot -p"$PASS" -e 'SHOW DATABASES;' --batch --skip-column-names | grep -Ewv "^Database|.*schema$")
# 遍历每个数据库并进行备份
for DB in $DATABASES; do
BACKUP_FILE="${DIR}/${DB}_${TIME}.sql.gz"
echo "Backing up database: ${DB} to ${BACKUP_FILE}"
if mysqldump -uroot -p"$PASS" -F --single-transaction --source-data=2 --default-character-set=utf8mb4 -q -B "$DB" | gzip > "$BACKUP_FILE"; then
echo "Backup completed successfully for database: ${DB}"
else
echo "Failed to backup database: ${DB}"
# 删除失败的备份文件
rm -f "$BACKUP_FILE"
fi
done恢复误删除的表
案例说明:每天2:30做完全备份,早上10:00误删除了表students,10:10才发现故障,现需要将数据库还原到10:10的状态,且恢复被删除的students表
#完全备份,要求必须开启二进制日志
[mysqld]
log-bin=/data/mysql/mysql-bin
#完全备份
mysqldump -uroot -p123456 -A -F -E -R --triggers --single-transaction --source-data=2 --flush-privileges --default-character-set=utf8mb4 --hex-blob > all.sql
#完全备份后数据更新
mysql> insert teachers(name,age,gender) values('zhao',20,'M');
Query OK, 1 row affected (0.00 sec)
#10:00误删除了一个重要的表
mysql> drop table classes;
Query OK, 0 rows affected (0.02 sec)
#后续其它表继续更新
mysql> insert students(name,age,gender) values('erqi',18,'M');
Query OK, 1 row affected (0.01 sec)
mysql> insert students(name,age,gender) values('huahua',18,'M');
Query OK, 1 row affected (0.01 sec)
mysql> select * from students;
。。。。。。
| 20 | Diao Chan | 19 | F | 7 | NULL |
| 21 | Huang Yueying | 22 | F | 6 | NULL |
| 22 | Xiao Qiao | 20 | F | 1 | NULL |
| 23 | Ma Chao | 23 | M | 4 | NULL |
| 24 | Xu Xian | 27 | M | NULL | NULL |
| 25 | Sun Dasheng | 100 | M | NULL | NULL |
| 26 | erqi | 18 | M | NULL | NULL |
| 27 | huahua | 18 | M | NULL | NULL |
+-------+---------------+-----+--------+---------+-----------+
27 rows in set (0.00 sec)
#10:10发现表删除,进行还原
#停止数据库访问
#从完全备份中,找到二进制位置
root@ubuntu2204:~#grep '\-\- CHANGE MASTER TO' all.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=157;
#备份从完全备份后的二进制日志,使用--no-defaults选项可以临时忽略配置文件的变量
root@ubuntu2204:~#mysqlbinlog --no-defaults --start-position=157 /data/mysql/mysql-bin.000002 > inc.sql
#如若还有后续的000003,000004二进制文件;可以采取追加的方式 >> 到inc.sql文件中
#找到误删除的语句,从备份中删除此语句
#如果文件过大,可以使用sed实现
root@ubuntu2204:~#sed -i '/DROP TABLE `classes`/d' inc.sql
#利用完全备份和修改过的二进制日志进行还原
mysql> set sql_log_bin=0;
mysql> source all.sql;
mysql> source inc.sql;
mysql> set sql_log_bin=1;
#测试验证数据库是否还原成功,如果成功恢复数据库访问