完全备份:整个数据库完整地进行备份
增量备份:在完全备份的基础之上,对后续新增的内容进行备份
冷备份:关机备份,停止mysql服务,然后进行备份
热备份:开机备份,无需关闭mysql服务,然后进行备份
物理备份:对数据库系统的物理文件(数据文件、日志文件)进行备份
逻辑备份:只是对数据库的逻辑组件进行备份(表结构),以sql语句的形式,把库、表机构、表数据进行备份保存 (直接在数据库系统中删除全部文件,逻辑备份无法恢复)
1、在生产环境中,数据的安全至关重要,任何数据的丢失都会产生非常严重的后果
2、数据为何丢失?
程序操作、运算错误、磁盘故障、不可预期的时间、人为操作
物理备份:一般采用完全备份,对整个数据库进行完整的打包备份
优点:操作简单
缺点:占用空间太大、备份和恢复的时间很长、需要暂停数据库服务避免有新的数据进入被覆盖,也可能导致恢复失败
- 创建两个新的库pup、pup1:
- create database pup;
- create database pup1;
-
- pup、pup1创建相同表info1并插入相同数据:
-
- create table if not exists info1 (
- id int(4) primary key,
- name char(5),
- hobby char(5)
- );

- [root@mysql1 ~]# systemctl stop mysqld
- [root@mysql1 ~]# cd /usr/local/mysql/
- [root@mysql1 mysql]# yum -y install xz
- [root@mysql1 mysql]# tar Jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data
- [root@mysql1 mysql]# cd /opt
- [root@mysql1 opt]# tar Jxvf mysql_all_2023-11-06.tar.xz
- [root@mysql1 opt]# cd /usr/local/mysql/
- [root@mysql1 mysql]# rm -rf data
- [root@mysql1 mysql]# cd /opt/usr/local/mysql/
- [root@mysql1 mysql]# cp -a data/ /usr/local/mysql/
- [root@mysql1 mysql]# systemctl restart mysqld.service

- mysql2虚拟机:
- [root@mysql2 mysql]# cd /usr/local/mysql/
- [root@mysql2 mysql]# rm -rf data/
- [root@mysql2 mysql]# scp -r root@20.0.0.81:/opt/usr/local/mysql/data /opt
- [root@mysql2 mysql]# cd /opt
- [root@mysql2 opt]# cp -a data/ /usr/local/mysql/
- [root@mysql2 opt]# systemctl restart mysqld.service
- [root@mysql2 opt]# cd /usr/local/mysql/data/
- [root@mysql2 data]# chown -R mysql.mysql pup pup1

mysqldump:Mysql自带的备份文件的命令
特点:方便、简单,但是只能基于逻辑上的表结构和表数据恢复
物理删除之后再用逻辑恢复会报错,也可以作为数据迁移
占用大空间,比较物理备份相对来说占的空间要小得多
- Mysql自带备份工具:mysqldump
-
- 备份一个库:mysqldump -u root -p --databases 库名 > /opt/备份名.sql (名称自定义,要以.sql结尾)
- 备份多个库:mysqldump -u root -p --databases 库名1 库名2 > /opt/备份名.sql
- 备份所有库:mysqldump -u root -p --all-databases > /opt/备份名.sql
- (只是逻辑意义上)
- [root@mysql1 ~]# systemctl restart mysqld.service
- [root@mysql1 ~]# netstat -antp | grep 3306
- [root@mysql1 ~]# mysqldump -u root -p --databases pup > /opt/pup.sql
- [root@mysql1 ~]# mysql -u root -p -e 'drop database pup;'
- #-e:指定连接库,执行命令后即刻退出
- #只能逻辑删除,物理删除/usr/local/mysql/data目录下的库文件无法恢复
- [root@mysql1 ~]# mysql -u root -p < /opt/pup.sql

- [root@mysql1 ~]# systemctl restart mysqld.service
- [root@mysql1 ~]# netstat -antp | grep 3306
- [root@mysql1 ~]# mysqldump -u root -p --databases pup pup1 > /opt/pup+pup1.sql
- [root@mysql1 ~]# mysql -u root -p -e 'drop database pup;'
- [root@mysql1 ~]# mysql -u root -p -e 'drop database pup1;'
- [root@mysql1 ~]# mysql -u root -p < /opt/pup+pup1.sql

- 备份表info1:
- [root@mysql1 data]# mysqldump -u root -p pup info1 > /opt/pup_info1.sql
- [root@mysql1 data]# mysql -u root -p -e 'drop table pup.info1;'

- 恢复:
- [root@mysql1 data]# mysql -u root -p pup < /opt/pup_info1.sql

- 恢复时,不同的库也可以读取备份内容:
- [root@mysql1 data]# mysql -u root -p pup1 < /opt/pup_info1.sql

pup库新建表info2
- 将表info1、info2备份在一个文件中:
- [root@mysql1 data]# mysqldump -u root -p pup info1 info2 > /opt/pup_info1-2.sql
- [root@mysql1 data]# mysql -u root -p -e 'drop table pup.info1;'
- [root@mysql1 data]# mysql -u root -p -e 'drop table pup.info2;'

- 恢复:
- [root@mysql1 opt]# mysql -u root -p pup < /opt/pup_info1-2.sql


- [root@mysql1 opt]# mysqldump -u root -p --all-databases > /opt/all_databases.sql
-
- 主机2创建库pup和pup2,pup和主机1中的库重名,以此进行对照





- 主机2使用主机1的所有库备份信息进行恢复:
- [root@mysql2 ~]# scp root@20.0.0.81:/opt/all_databases.sql /opt
- [root@mysql2 ~]# mysql -u root -p < /opt/all_databases.sql
结果:



- 结论:
- 当数据在主机间进行迁移时,有同名的库其数据不会被覆盖,没有的库及其数据会迁移进来
mysqldump也支持增量备份
优点:没有重复数据,备份量小,时间短
缺点:备份恢复时锁表,必然会影响业务,超过10G耗时会比较长,导致服务不可用
Mysql二进制日志记录格式有三种:
实操:
- Mysql提供的二进制日志间接地实现增量备份
- 如何获取此二进制文件?
- [root@mysql1 opt]# vim /etc/my.cnf
- --插入--
- log-bin=mysql-bin
- binlog_format=MIXED
-
- [root@mysql1 opt]# systemctl restart mysqld.service



mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000001

mysqladmin -u root -p flush-logs




mysqlbinlog --no-defaults mysql-bin.000001 | mysql -u root -p

- 基于位置点来进行恢复,三种方式:
- 从某一个点开始,恢复到最后:mysqlbinlog --no-defaults --start-position='位置点' 文件名 | mysql -u root -p
-
- 从开头恢复到某个位置:mysqlbinlog --no-defaults --stop-position='位置点' 文件名 | mysql -u root -p
-
- 从指定点恢复到指定结束点:mysqlbinlog --no-defaults --start-position='位置点' --stop-position='位置点' 文件名 | mysql -u root -p

以插入数据4之前为起点,恢复4、5、6
mysqlbinlog --no-defaults --start-position='296' mysql-bin.000001 | mysql -u root -p


删除4、5、6,以插入完数据6为终点,恢复4、5、6
mysqlbinlog --no-defaults --stop-position='1096' mysql-bin.000001 | mysql -u root -p


删除4、5、6,以插入数据5前为起点,插入完数据6为终点,恢复5、6
mysqlbinlog --no-defaults --start-position='610' --stop-position='1096' mysql-bin.000001 | mysql -u root -p


mysqlbinlog --no-defaults --start-datetime='时间点' 文件 | mysql -u root -p
mysqlbinlog --no-defaults --stop-datetime='时间点' 文件 | mysql -u root -p
mysqlbinlog --no-defaults --start-datetime='时间点' --stop-datetime='时间点' 文件名 | mysql -u root -p
- 用来记录当MySQL启动、停止或运行时发生的错误信息,默认已开启
- vim /etc/my.cnf
- --添加--
- log-error=/usr/local/mysql/data/mysql_error.log
- 用来记录MySQL的所有连接和语句,默认是关闭的
- vim /etc/my.cnf
- --添加--
- general_log=ON
- general_log_file=/usr/local/mysql/data/mysql_general.log
-
- 查看通用日志是否开启:
- show variables like 'general%'
- 用来记录所有当MySQL启动、停止或运行时发送的错误信息,默认是关闭的
- vim /etc/my.cnf
- --添加--
- log-bin=mysql-bin
-
- 查看二进制日志是否开启:
- show variables like 'log_bin%';
- 用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便于优化,默认是关闭的
- 慢查询日志也可用来查询哪些搜索的字段超时,可以选择是否需要增加索引,加快查询速度。
- vim /etc/my.cnf
- --添加--
- slow_query_log=ON
- slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
- long_query_time=5 #修改慢查询时间
-
- 查看慢查询是否开启:
- show variables like '%slow%';
- 查看慢查询时间:
- show variables like 'long_query_time';