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 密码 二进制日志名

 

posted @ 2019-04-17 20:22  成杭君  阅读(156)  评论(0编辑  收藏  举报