mysql备份
对于任何数据库来说,备份都是非常重要的
数据库复制不能取代备份的作用
数据库备份分为逻辑备份和物理备份:
逻辑备份的结果为SQL语句,适合于所有存储引擎,花费时间长
物理备份是对数据库目录的拷贝,对于内存表只备份结构,可使用离线备份和在线备份
按照数据库备份内容分为全量备份和增量备份:
全量备份是对整个数据库的一个完整备份、
增量备份是在上次全量或增量备份基础上,对于更改数据进行的备份,Mysqldump不支持增量备份
使用mysqldump进行备份
mysqldump [OPTIONS] database [tables]
mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2..]
mysqldump [OPTIONS] --all-databases [OPTIONS]
备份权限需具备 SELECT,RELOAD,LOCK TABLES,REPLICATION CLIENT,SHOW VIEW,PROCESS
常用参数:--single-transaction (Innodb引擎)
-l,--lock-tables (非Innodb)
-x,--lock-all-tables
--master-data=[1/2] (默认为1)
-R,--routines (指定存储过程)
--triggers (触发器)
-E,--events (指定备份中的调度事件)
--hex-blob (BINARY, VARBINARY, BLOB, BIT类型导出为十六进制)
--tab=path (在指定的目录下生产两个文件,存储表结构和表数据)
-w,--where='过滤条件' (指定条件导出,只支持单表数据条件导出)
建立备份账号:create user '用户名'@'地址' identified by '密码';
grant select,reload,lock tables,replication client,show view,event ,process on *.* to '用户名'@‘地址’;
flush privileges; (刷新权限)
例:mysqldump -u用户名 -p --master-data=2 --single-transaction --routines --triggers --events 数据库 >文件.sql
grep "CREATE TABLE" 文件.sql # 查看
mysqldump -u用户名 -p --master-data=2 --single-transaction --routines --triggers --events 数据库 表 >文件.sql
mysqldump -u用户名 -p --master-data=1 --single-transaction --routines --triggers --events --all-databases >文件.sql (change master未被注释)
more 文件.sql
grep "Current Database" 文件.sql
grant file on *.* to '用户名'@‘地址’; chown mysql:mysql 目录/
mysqldump -u用户名 -p --master-data=2 --single-transaction --routines --triggers --events --tab="./" 数据库
mysqldump -u用户名 -p --master-data=2 --single-transaction --where ''id>1000 and id<1050'' 数据库 表 >文件.sql
脚本:
#!/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=""
PASSWD=""
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 -p dbname < .sql
mysql> source /./.sql
例:mysql -u名 -p -e"create database 库"
mysql -u名 -p 库<.sql
source 地址.sql; load data infile '/./.txt' into table 表;
insert into(.,.,.) select a.* from a left join b on a.id=b.id where b.id isnull; 静态的恢复误操作
指定时间点恢复先决条件:
具有指定时间点前的一个全备
具有自上次全备后到指定时间点的所有二进制日志
恢复步骤:
查看文件名日志点:more .sql
查看操作的时间点:mysqlbinlog -vv --base64-output=decode-rows --start-position=1831 --database=数据库 mysql-bin.000019 | grep -i insert | more; (grep -B3 delete)
差异日志导入:mysqlbinlog --start-position=1831 --stop-position=2558 --database=数据库 mysql-bin.000019 >.sql
恢复:mysql -uroot -p 数据库 < .sql
实时二进制日志备份:用户需具备 replication slave权限
mysqlbinlog --raw --read-from-remote-server --stop-never --host IP --port 3306 -u 用户名 -p 密码 二进制日志名