mysql之备份恢复(mysqldump)

备份类型

  • 完全备份:数据库当前的状态全部备份下来

在这里插入图片描述

  • 增量备份:只备份增加的一部分状态。
    在这里插入图片描述

  • 差异备份:完全备份以后,目前为止应该备份的数据
    在这里插入图片描述

备份方式:

  • 冷备:暂停服务,读写操作都不能进行
  • 温备:读操作可执行,写操作不行
  • 热备:读写操作均可执行

备份工具

mysqldump是一个备份工具,它是通过mysql协议连接到mysql服务器上,用select语句对每个库进行查询之后得到的状态进行备份。

mysqldump语法

  • mysqldump [OPTIONS] database [tables] :对数据库或者表进行备份
  • mysqldump [OPTIONS] –B DB1 [DB2 DB3...]:对多个数据库进行备份
  • mysqldump [OPTIONS] –A [OPTIONS]:对所有数据库进行备份

常用选项

  • -A --all-databases:备份所有数据库,里面含有create database

  • -B,--databases db_name:指定备份的数据库,包含create database

  • -E , --events:备份相关的所有event scheduler

  • -R,--routines:备份相关的存储过程和存储函数

  • --triggers:备份表相关的触发器

  • --master-data[=#]

    • 1: 所备份的数据之前加一条记录为CHANGE MASTER TO 语句,非注释,不指定#,默认为1
    • 2:记录为注释的CHANGE MASTER TO 语句。
    • 此选项会自动关闭–lock-tables功能,自动打开–lock-all-tables功能
  • -F,--flush-logs:备份前滚日志,锁定表完成后,执行flush logs命令,生成新的二进制文件、配合-A时,会多次刷新数据库,在同一时刻执行转储和日志刷新,应同时使用--flush-logs-x,--master-data-single-transaction,此时只刷新一次

  • --compact:去掉注释,适合调试,生产不适用

  • -d,--no-data:只备份表结构

  • -t,--no-create-info:只备份数据,不备份create table

  • -n, --no-create-db:不备份create database,可被-A或-B覆盖

  • --flush-privileges:备份mysql或相关权限时需要使用

  • -f, --force:忽略SQL错误,继续执行

  • -q, --quick: 不缓存查询,直接输出,加快备份速度

备份还原示例

此处我用了一个没有安装过mariadb的版本。重头开始。
(1)运行 mysql_secure_installation
(2)创建存放二进制日志和备份文件的目录

[root@localhost ~]# mkdir /data/mysql/binlog -pv

[root@localhost ~]# mkdir /data/mysql/backup

[root@localhost ~]# chown -R mysql.mysql /data

(3)配置my.cnf

[root@localhost ~]# cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-bin=/data/mysql/binlog/master  # 开启二进制日志
innodb-file-per-table=ON     #数据库数据分开存放
skip-name-resolve=ON       #跳过反向解析
autocommit=0              #取消自动提交事务

(4)导入数据库hellodb

[root@localhost ~]# mysql -uroot -pydong < hellodb_innodb.sql 

(5)完全备份数据库现状

[root@localhost ~]# mysqldump -uroot -pydong -A -F --single-transaction --flush-privileges --master-data=1 > /data/mysql/backup/fullback_`date +%F`.sql

[root@localhost ~]# ls /data/mysql/backup/
fullback_2020-03-01.sql

(6)删除/var/lib/mysql/下所有目录

[root@localhost ~]# rm -rf /var/lib/mysql/*

(7)进行还原
还原的时候需要注意,我们在还原的时候应该停止服务,或者禁止所有用户连接进来,为了防止数据发生错误。 本机放一份儿备份,其它地方也要存在备份

[root@localhost ~]# systemctl stop mariadb
[root@localhost ~]# mysql  < /data/mysql/backup/fullback_2020-03-01.sql 

(8)查看是否还原

[root@localhost ~]# ls /var/lib/mysql
aria_log.00000001  hellodb  ib_logfile0  mariadb-relay-bin.000001  master.info  mysql.sock          relay-log.info
aria_log_control   ibdata1  ib_logfile1  mariadb-relay-bin.index   mysql        performance_schema  test

MariaDB [hellodb]> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name          | Age | Gender |
+-----+---------------+-----+--------+
|   1 | Song Jiang    |  45 | M      |
|   2 | Zhang Sanfeng |  94 | M      |
|   3 | Miejue Shitai |  77 | F      |
|   4 | Lin Chaoying  |  93 | F      |
+-----+---------------+-----+--------+
4 rows in set (0.00 sec)

增量备份

(1)先使用flush logs将日志文件进行刷新

MariaDB [hellodb]> flush logs;
MariaDB [hellodb]> show master logs;
+---------------+-----------+
| Log_name      | File_size |
+---------------+-----------+
| master.000001 |       264 |
| master.000002 |       264 |
| master.000003 |      7695 |
| master.000004 |       264 |
| master.000005 |     30760 |
| master.000006 |   1038814 |
| master.000007 |    520959 |
| master.000008 |       245 |   #以后所写入的数据通通回到08里面

(2)对students表进行一些简单的操作

MariaDB [hellodb]> INSERT students VALUES (27,'Guan yin' ,102,'F',3,4);
MariaDB [hellodb]> SELECT * FROM students WHERE Stuid>25; 
+-------+----------+-----+--------+---------+-----------+
| StuID | Name     | Age | Gender | ClassID | TeacherID |
+-------+----------+-----+--------+---------+-----------+
|    26 | Ru lai   | 101 | M      |       1 |         2 |
|    27 | Guan yin | 102 | F      |       3 |         4 |
+-------+----------+-----+--------+---------+-----------+
MariaDB [hellodb]> DELETE FROM students WHERE Stuid=26;

MariaDB [hellodb]> SELECT * FROM students WHERE Stuid>25; 
+-------+----------+-----+--------+---------+-----------+
| StuID | Name     | Age | Gender | ClassID | TeacherID |
+-------+----------+-----+--------+---------+-----------+
|    27 | Guan yin | 102 | F      |       3 |         4 |
+-------+----------+-----+--------+---------+-----------+

(3)备份刚才增加的操作。

[root@localhost ~]# mysqlbinlog /data/mysql/binlog/master.000008 > /data/mysql/backup/inc_`date +%F-%T`.sql

[root@localhost ~]# ll /data/mysql/backup
总用量 516
-rw-r--r-- 1 root root 520869 3月   1 15:44 fullback_2020-03-01.sql
-rw-r--r-- 1 root root   1980 3月   1 17:20 inc_2020-03-01-17:20:01.sql

(4)删除/var/lib/mysql下所有文件

[root@localhost ~]# rm -rf /var/lib/mysql/*

(5)首先进行完全备份的还原

[root@localhost ~]# mysql < /data/mysql/backup/fullback_2020-03-01.sql 
MariaDB [hellodb]> SELECT * FROM students ORDER BY Stuid  DESC LIMIT 1; 
+-------+-------------+-----+--------+---------+-----------+
| StuID | Name        | Age | Gender | ClassID | TeacherID |
+-------+-------------+-----+--------+---------+-----------+
|    25 | Sun Dasheng | 100 | M      |    NULL |      NULL |
+-------+-------------+-----+--------+---------+-----------+
#只到25号的学生。

(6)增加二进制日志的还原

[root@localhost ~]# mysql -uroot -pydong < /data/mysql/backup/inc_2020-03-01-17\:20\:01.sql

MariaDB [hellodb]> SELECT * FROM students WHERE Stuid >= 25;
+-------+-------------+-----+--------+---------+-----------+
| StuID | Name        | Age | Gender | ClassID | TeacherID |
+-------+-------------+-----+--------+---------+-----------+
|    25 | Sun Dasheng | 100 | M      |    NULL |      NULL |
|    27 | Guan yin    | 102 | F      |       3 |         4 |
+-------+-------------+-----+--------+---------+-----------+
 

PS

  • 在做还原的时候一定要让数据库拒绝所有人的访问。以免产生冲突
  • yum自动安装的数据库,mysql.socket放在了/var/lib/mysql下。所以/var/lib/mysql下文件全部消失的话,需要重新启动一下数据库,让服务自动生成socket文件。
  • 在做增量备份的时候一定要刷新日志,如果不刷新日志的话,你得自己记住从哪个节点开始是增量的。
  • 定时清理二进制日志。
  • 备份文件一定要主机放一份,别处放一份
  • mysqldump适用于数据库不大的场景,如果数据量大,可以结合-q选项增加备份速度。

猜你喜欢

转载自blog.csdn.net/qq_44564366/article/details/104579152