基于mysql社区版5.7,严重声明:本文中图方便直接写入了-p数据库密码,在生产环境中如果指定了一定要使用history -C清空历史命令记录哦,所有博客作者原创纯手打,转载一定要注明本博客链接,感谢!
逻辑备份:使用mysqldump进行备份可以进行逻辑备份。
完全备份:备份所有数据。
增量备份:备份上次备份后,所有新产生的数据。
差异备份:备份完全备份后,所有产生的数据。
mysqldump -uroot -ppassword 库名 > /目录/备份文件名.sql
#使用mysqldump逻辑备份时会自动锁表,导致数据无法写入。正好可以使用这一特性,组合--flush-logs刷新binlog日志,这样
#可以使得备份完成后刷新日志,对日志进行断点。可以在出现故障的第一时间使用备份后开始的binlog进行恢复,可以提升一部分效率。
备份时库名表示方式:
* --all-databases 或 -A //备份所有库
* 数据库名 //备份单个库
* 数据库名 表名 //单张表
* -B 数据库1 数据库2 //多个库
mysql -uroot -ppassword [库名] < 目录/xxx.sql
? binlog日志也称作二进制日志,记录除查询外的所有的SQL命令,可以用于数据备份和恢复,配置mysql主从同步的必要条件。
要使用binlog日志必须要要先打开binlog日志记录功能,在/etc/my.cnf下打开#log_bin注释
log_bin=/binlog存放目录/命名前缀
# 可以单独只打开log_bin,而不指定路径和名字,将默认存放到mysql主文件夹中,在rpm包安装中默认路径是/var/lib/mysql目录,名称
#前缀也可以不指定默认使用主机名作为前缀,设定了存放目录后要给mysql写入权限才能使用,如果不给写入权限会导致服务无法启动。
server_id=1
# 指定服务器ID值范围1-255,开启binlog一定要设置服务器ID不设定也会无法启动服务。
max_binlog_size=数值m
# 指定日志文件容量,默认1G
binlog_format="Mixed"
# 指定binlog日志记录模式,修改为mixed模式。三种日志记录模式分别是:row(行模式)、statement(报表模式)、mixed(混合模式)在修改配置文件后需要将mysql重启服务才能生效。
show master status ;
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
|---|---|---|---|---|
| 当前日志文件 | 偏移量 | 只记录指定数据库的二进制日志 | 不记录指定数据库的二进制日志 | 已执行的事务编号 |
看到File和Positiion有值后即为打开成功。
删除所有的binlog日志,重建日志:reset master。
通过在数据库命令行中查询binlog日志查看日志记录模式是否改成混合模式。
show variables like "%binlog_format%";
#如果values是MIXED则说明开启了混合模式。
说到这里又要扯到mysql binlog三种模式。
| 模式 | 优点 | 缺点 |
|---|---|---|
| row(行模式) | 非常清楚记录下每一行数据被修改的细节,可以很好支持存储过程和function以及trigger调用和触发器。 | 主从同步占用大量磁盘IO,日志量巨大。 |
| statement(报表模式) | 记录每一条修改数据的SQL语句事件,并非每条更改记录。减少了binlog日志量,节约磁盘IO,提升性能。 | 函数、存储过程的复制不能很好的支持,导致有时主从同步出现问题。 |
| Mixed(混合模式) | MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志格式,也就是在Statement和Row之间选择一种,缓和了磁盘IO,和日志文件大小。 | 兼顾解决磁盘IO问题,但未测试函数、存储过程等。(看下方) |
# at 285168
#191014 23:35:10 server id 1 end_log_pos 285199 CRC32 0x0cb3a5df Xid = 3048
COMMIT/*!*/;
# at 285199
#191014 23:36:23 server id 1 end_log_pos 285264 CRC32 0x9d6c36f7 Anonymous_GTID last_committed=1012 sequence_number=1013
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 285264
#191014 23:36:23 server id 1 end_log_pos 285342 CRC32 0xa7d96de8 Query thread_id=1016 exec_time=0 error_code=0
SET TIMESTAMP=1571067383/*!*/;
BEGIN
/*!*/;
# at 285342
#191014 23:36:23 server id 1 end_log_pos 285439 CRC32 0x379d2612 Query thread_id=1016 exec_time=0 error_code=0
SET TIMESTAMP=1571067383/*!*/;
delete from userdb2.tb1
/*!*/;通过binlog时间区间/偏移量进行恢复
mysqlbinlog [选项] binlog日志文件名 | mysql -uroot -p
| 选项 |
|---|
| --start-datetime="yyyy-mm-dd hh:mm:ss" |
| --stop-datetime="yyyy-mm-dd hh:mm:ss" |
| --strat-position=偏移量 |
| --stop-position=偏移量 |
恢复思路:
mysql -uroot -p12345 -e "create database testdb charset=utf8;"
mysql -uroot -p12345 -e "create table testdb.testtb1(id int);"
for i in {1..1000};do mysql -uroot -p12345 -e "insert into testdb.testtb1(id) values($i);" ;done
mysqldump -uroot -p12345 --flush-logs -B testdb > /tmp/testdb.sql
#参数-B和不加有何区别?
#1.区别就在于加参数B后可以指定备份数据库列表。
#2.生成的数据库备份文件中含有创建数据库和选择数据库的指令。
#CREATE DATABASE /*!32312 IF NOT EXISTS*/ `testdb` /*!40100 DEFAULT CHARACTER SET utf8 */;
#USE `testdb`;
for i in {3000..4000};do mysql -uroot -p12345 -e "insert into testdb.testtb1(id) values($i);" ;done && mysql -uroot -p12345 -e "insert into testdb.testtb1(id) values(666);" ;
mysql -uroot -p12345 -e "drop database testdb;"
mysql -uroot -p12345 < testdb.sql
[root@db-master tmp]# mysql -uroot -p12345 -e "select count(*) from testdb.testtb1"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------+
| count(*) |
+----------+
| 1000 |
+----------+
# at 869709
#191015 0:19:55 server id 1 end_log_pos 875708 CRC32 0x9b4fd429 Query thread_id=3032 exec_time=0 error_code=0
SET TIMESTAMP=1571069995/*!*/;
******************************************************************************************
内容过多省略
******************************************************************************************
# at 875708
#191015 0:19:56 server id 1 end_log_pos 296078 CRC32 0x84203c10 Query thread_id=4040 exec_time=0 error_code=0
SET TIMESTAMP=1571071195/*!*/;
insert into testdb.testtb1(id) values(666)
/*!*/;
mysqlbinlog --strat-position=869709 --stop-position=875708 /logfile/lqh.000001 | mysql -uroot -p12345原文:https://www.cnblogs.com/lqinghua/p/11675093.html