备份类型
- 完全备份:数据库当前的状态全部备份下来
-
增量备份:只备份增加的一部分状态。
-
差异备份:完全备份以后,目前为止应该备份的数据
备份方式:
- 冷备:暂停服务,读写操作都不能进行
- 温备:读操作可执行,写操作不行
- 热备:读写操作均可执行
备份工具
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选项增加备份速度。