- 物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份
方法:
(1)冷备份:在关闭数据库的时候进行
(2)热备份:数据库处于运行状态,依赖于数据库的日志文件
(3)温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作
- 逻辑备份:对数据库逻辑组件(如:表等数据库对象)的备份
方法:
(1)完全备份:对数据库的整个内容进行备份,备份和恢复操作都非常简单方便,但是完全备份占用空间大,备份时间也长
(2)增量备份:只以上次完全备份或增量备份的时间点对后面修改的文件进行备份,备份数量小,占用空间小,备份速度快,但恢复需要从上一次的完整备份开始到最后一次增量备份之间的所有增量依次恢复,如果中间损坏了一次,则将导致数据的丢失
(3)差异备份;对上次完全备份后被修改过的所有文件进行备份,其备份数据量会越来越大,恢复数据只要恢复上次的完全备份和最佳的一次差异备份
MySQL的日志默认保存位置为/usr/local/mysql/data
vim /etc/my.cnf #修改配置文件
[musqld]
log-error=/usr/local/mysql/data/mysql_error.log #在配置文件中mysqld下添加错误日志路径
#通用查询日志,用来记录MySQL的所有连接和语句,默认是关闭的
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
#二进制日志,用来记录所有更新了数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复,默认已开启
log-bin=mysql-bin
#慢查询日志,用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便于优化,默认时关闭的
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query_.log
long_query_time=5 #设置5秒执行的居于被记录,默认为10秒
mysql> show variables like 'general%';
+------------------+---------------------------------+
| Variable_name | Value |
+------------------+---------------------------------+
| general_log | OFF |
| general_log_file | /usr/local/mysql/data/mysql.log |
+------------------+---------------------------------+
2 rows in set (0.00 sec)
mysql> show variables like 'log_bin%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin | OFF |
| log_bin_basename | |
| log_bin_index | |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
+---------------------------------+-------+
5 rows in set (0.00 sec)
mysql> show variables like '%slow%';
+---------------------------+--------------------------------------+
| Variable_name | Value |
+---------------------------+--------------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_file | /usr/local/mysql/data/mysql-slow.log |
+---------------------------+--------------------------------------+
5 rows in set (0.01 sec)
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.01 sec)
[root@mysql ~]# systemctl restart mysqld.service
[root@mysql ~]# netstat -antp | grep 3306
tcp6 0 0 :::3306 :::* LISTEN 24452/mysqld
[root@mysql ~]# cd /usr/local/mysql/data/
[root@mysql data]# ls #查看日志文件
auto.cnf ibdata1 ib_logfile1 mysql mysql-bin.index mysql_slow_query.log sys
ib_buffer_pool ib_logfile0 ibtmp1 mysql-bin.000001 mysql_error.log performance_schema whd
##mysql-bin.000001 :二进制文件
##mysql-bin.index :二进制文件的索引文件
[root@mysql data]# cat mysql-bin.index
./mysql-bin.000001
[root@mysql data]# systemctl restart mysqld.service
[root@mysql data]# ls
auto.cnf ib_logfile0 mysql mysql-bin.index performance_schema
ib_buffer_pool ib_logfile1 mysql-bin.000001 mysql_error.log sys
ibdata1 ibtmp1 mysql-bin.000002 mysql_slow_query.log whd
##每次重启都会产生个二进制日志文件
mysql> show variables like '%slow%'; #再查询二进制文件
+---------------------------+--------------------------------------------+
| Variable_name | Value |
+---------------------------+--------------------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | /usr/local/mysql/data/mysql_slow_query.log |
+---------------------------+--------------------------------------------+
5 rows in set (0.01 sec)
(1)完全备份一个或多个完整的库
mysqldump -u root -p --databases 库名1 库名2 > /备份路径/备份文件名.sql
mysql -uroot -p -e 'select * from 库名.表名;' #可以不同进入mysql数据库进行操作mysql数据库命令
(2)完全备份mysql服务器整个库
mysqldump -uroot -p --all-databases > /备份路径/all.sql
(3)完全备份指定库中的表
mysqldump -uroot -p 库名 表名1 表名2 >/备份路径/备份文件名.sql
[root@mysql mysql]# mysqldump -uroot -p --databases whd > /opt/whd.sql #备份单个库
Enter password: ***
[root@mysql mysql]# ll /opt/whd.sql
-rw-r--r--. 1 root root 1955 7月 13 20:17 /opt/whd.sql
[root@mysql mysql]# mysqldump -uroot -p --all-databases > /opt/all.sql #备份整个mysql所有库
Enter password:
[root@mysql mysql]# ll /opt/all.sql
-rw-r--r--. 1 root root 781887 7月 13 20:20 /opt/all.sql
[root@mysql mysql]# mysqldump -uroot -p whd test > /opt/test.sql #备份某个表,-p后面加-d表示只备份表结构
Enter password:
[root@mysql mysql]# ll /opt/test.sql
-rw-r--r--. 1 root root 1821 7月 13 20:27 /opt/test.sql
[root@mysql mysql]# mkdir /bachup
[root@mysql mysql]# mysqldump -uroot -p --databases whd > /bachup/a-$(date +%F).sql
Enter password:
[root@mysql mysql]# mysqldump -uroot -p --all-databases > /bachup/all-databases-$(date +%F).sql
Enter password:
[root@mysql mysql]# cd /bachup
[root@mysql bachup]# ls
a-2021-07-14.sql all-databases-2021-07-14.sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| whd |
+--------------------+
5 rows in set (0.00 sec)
mysql> drop database whd;
Query OK, 1 row affected (0.02 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> source /bachup/a-2021-07-14.sql; #在数据库中恢复
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| whd |
+--------------------+
[root@mysql bachup]# mysql -uroot -p < /bachup/a-2021-07-14.sql #也可以直接在命令行恢复
恢复表时source跟恢复库一样,用mysql命令的话需要指定数据库,并且该库必须存在
[root@mysql bachup]# vim /etc/my.cnf #开启二进制文件
log-bin=mysql-bin
binlog_fromat = MIXED
二进制日志有三种不同的记录格式:
statement:每一条涉及被修改的sql都会被记录在binlog中,缺点是日质量过大,
ROW:只记录变动的记录,不记录sql的上下文环境,缺点,如果遇到update set where true 那么binlog的数据量会越来越大
MIXED:一般的语句使用statement,函数使用ROW方式存储
查看二进制文件
[root@mysql data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v ./mysql-bin.000001
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4 ##at这里表示位置点
#210713 19:09:04 server id 1 end_log_pos 123 CRC32 0x17d2d3ee Start: binlog v 4, server v 5.7.20-log created 210713 19:09:04 at startup
ROLLBACK/*!*/;
# at 123
#210713 19:09:04 server id 1 end_log_pos 154 CRC32 0x4b7d48dd Previous-GTIDs
# [empty]
# at 154 210713 19:09:04 server id 1 end_log_pos 177 CRC32 0x3c823e3e Stop
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
mysqladmin -uroot -p flush-logs
#刷新二进制文件,相当于将上一个二进制文件复制一份
[root@mysql data]# mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p
##缺点:它是基于二进制文件全部内容进行恢复,他无法保证上一个二进制文件中内容的修改是否影响这次的恢复
如:上一个二进制文件中删除了一个库中的表,这里进行恢复的话就会报错,无法找到那张表
##仅恢复到位置点664之前的数据
mysqlbinlog --no-defaults --stop-position='663' /opt/mysql-bin.000001 | mysql -uroot -p
##仅恢复由664开始后的数据
mysqlbinlog --no-defaults --start-position='664' /opt/mysql-bin.000001 | mysql -uroot -p
##仅恢复由400开始到664为止的数据
mysqlbinlog --no-defaults --start-position='400' --stop-position='664' /opt/mysql-bin.000001 | mysql -uroot -p