逻辑备份和物理备份

逻辑备份的结果为sql语句,适合于所有存储引擎。

缺点:时间长,会进行表锁定

物理备份是对数据库目录的拷贝,对于内存表只备份结构。

全量备份和增量备份

全量备份是对整个数据库的一个完整备份

增量备份是在上次全量或增量备份基础上,对于更改数据进行的备份

mysqldump不支持增量备份

mysqldump

常用语法

mysqldump [options] database [tables]

mysqldump [options] –databases [options] DB1 [DB2]

可以备份多个数据库 数据库之间用空格隔离 ,多个表 得备份也用空格隔离。

如果是所有的库表

mysqldump [options] –all-databases [options]

Mysqldump的常用参数

-u,–user=name

-p,–password

完成备份操作所拥有的权限:select,reload,lock tables,replication client,show view,process。

–single-transaction 备份的时候开启事务操作。保持一致性

-l,–lock-tables 非事务型,锁住一个数据库的所有表。不常用和上面的不能相互使用,执行期只能读操作

-x,–lock-all-tables 保证整个实例所有数据库数据一致,执行期只能读操作。

–master-data=[1或2]。为我的时候change master 的命令为注释状态、默认为一

-R,–routines 备份数据库中的存储过程

–triggers 备份数据库得到触发器

-E,–events 备份数据库的调度事件。

–hex-blob 数据库以16进制保存 对二进制类型,来说转换成文本文件是不可见的,转换成16进制就可以了。

–tab=path 在指定的目录下生成两份文件、一个表结构一个表数据

-w,–where=’过滤条件’ where只支持单表数据库条件导出

创建备份用户

create user 'backup'@'localhost' identified by '123456';

`grant select,reload,lock tables,replication client,show view,event,process
on . to 'backup'@'localhost';`

`mysqldump -u backup -p --master-data=2 --single-transaction
--routinues --triggers --events mc_orderdb >mc_orderdb.sql`

图

上面是对一个库的备份 ,下面做库下面的表的备份

mysqldump -u backup -p --master-data=2 --single-transaction 
--routinues --triggers --events mc_orderdb order_master >order_master.sql

备份时会出现如下信息

Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, 
even those that changed suppressed parts of the database. If you don‘t want to restore GTIDs, 
pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events
关于GTID是5.6以后,加入了全局事务 ID (GTID) 来强化数据库的主备一致性,故障恢复,以及容错能力。
官方给的:A global transaction identifier (GTID) is a unique identifier created and associated with each transaction committed on the server of origin (master).
所以可能是因为在一个数据库里面唯一,但是当导入其他的库就有可能重复。所有会有一个提醒。

可以通过添加--set-gtid-purged=off 或者–gtid-mode=OFF这两个参数设置。
个人认为是在导入库中重新生产GTID,而不用原来的。

备份MySQL所有数据库

mysqldump -ubackup -p --master-data=1 --single-transaction --routines --triggers
--events --all-datanases > mc.sql

推荐–master-data=2, 如果为1在恢复的时候可能会出错。

–tab参数的使用方法

在给backup添加file权限、

grant file on *.* 'backup'@'localhost';

在linux下新建个目录

mkdir /tmp/mc_orderdb  && chown mysql:mysql /tmp/db_backup/mc_orderdb 更改文件目录权限
mysqldump -u backup -p --master-data=2 --single-transacion --routines 
--triggers --events --tab='/tmp/db_backup/mc_orderdb' mc_orderdb

mysql

sql是表结构 txt是表数据

如果是yum源、可能会出现ERROR 1290 (HY000):原因是:

因为在MySQL 5.7.6版本之后,导入文件只能在secure_file_priv指定的文件夹下
所以用show variables like ‘%secure%’;命令显示文件目录

+——————————–+————————-+
| Variable_name | Value |
+——————————–+————————-+
| require_secure_transport | OFF |
| secure_auth | ON |
| secure_file_priv | /var/lib/mysql-files/|
+——————————–+————————-+

指定的文件目录必须是/var/lib/mysql-files、当然也可把secure_aush 设置为off

注意:加上–tab参数 –master-data 参数的效果 数据不会出现在sql文件中

–where参数使用方法

mysqldump -ubackup -p --master-data=2 --single-transaction --where 'order_id>1000 and
order_id<1050' mc_orderdb order_master > order_master_1000.sql

备份数据库的shell脚本

#!/bin/bash
###############Basic parameters##########################
DAY=`date +%Y%m%d`
Environment=$(/sbin/ifconfig | grep "inet addr" | head -1 |grep -v "127.0.0.1" | awk '{print $2;}' | awk -F':' '{print $2;}')
USER="backup"
PASSWD="123456"
HostPort="3306"
MYSQLBASE="/home/mysql/"
DATADIR="/home/db_backup/${DAY}"
MYSQL=`/usr/bin/which mysql`
MYSQLDUMP=`/usr/bin/which mysqldump`
mkdir -p ${DATADIR}

Dump(){
 ${MYSQLDUMP} --master-data=2 --single-transaction  --routines --triggers --events -u${USER} -p${PASSWD} -P${HostPort} ${database}  > ${DATADIR}/${Environment}-${database}.sql
 cd ${DATADIR}
 gzip ${Environment}-${database}.sql
}

for db in `echo "SELECT schema_name FROM information_schema.schemata where schema_name not in ('information_schema','sys','performance_schema')" | ${MYSQL} -u${USER} -p${PASSWD} --skip-column-names`
do
   database=${db}
   Dump
done

Mysqldump备份的数据库恢复

mysql -u root -p dbname < backup.sql
在mysql内部命令行下
mysql>source  /tmp/backup.sql

Mysql基于时间点的回复

前提条件是开启了mysql的bin-log日志,并具有自上次全备后到指定时间点的所有二进制日志。

具有指定时间点前的一个全备。(非-tab那种)

图

`mysqlbinlog --base64-output=decode-rows -vv -start-positon=154 --database=search
mysql-bin.000015 | grep -B3 DEIETE | more`

显示结果:

图

把日志导出来

mysqlbinlog --start-position=154 --stop-position=9412 --database=search
mysql-bin.000015 >search_dif.sql

然后恢复最近的sql本分文件 也就是MASTER_LOG_POS=154那个文件。

执行导入

mysql -u root -p  search <search_dif.sql

图

恢复了 我之前删除的1000条数据

注意:导出日志后一定要恢复最近一期的本分文件、否则出现1032错误 can’t find record table 错误

Last modification:February 10, 2020
如果觉得我的文章对你有用,请随意赞赏