逻辑备份和物理备份
逻辑备份的结果为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
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 错误