数据库备份与恢复-电商数据库设计及优化学习笔记

一、背景

这是我的电商数据库设计及优化学习笔记关于数据库备份与恢复的内容。

二、学习笔记

对任何数据库来说,备份都是很重要的,数据库复制并不能取代备份的作用。
按结果分类
逻辑备份:结果为SQL语句,适合于所有存储引擎
物理备份:是对数据库目录的拷贝,对于内存表只备份结构
按照备份的数据库内容来分
全量备份:是对整个数据库的一个完整备份
增量备份:在上次全量或增量备份的基础上,对于更改数据进行备份

使用mysqldump进行备份
备份结果是可读的SQL文件,语法如下:
mysqldump [OPTIONS] database [tables]
mysqldump [OPTIONS] –database [OPTIONS] DB1 [DB2]
mysqldump [OPTIONS] –all-database [OPTIONS]
常用参数:
-u,–user=name
-p,–password[=name]
备份时数据库账号要具有以下权限:SELECT,RELOAD,LOCK,TABLES,REPLICATION CLIENT,SHOW VIEW,PROCESS,才能完成一个完整的备份操作
–single-transaction
-l,–lock-tables
-x,–lock-all-tables
–master-data=[1/2]
如果要备份的数据库中包含了存储过程、触发器、数据库调度时间,那么要指定以下这些参数才能备份
-R,–routines 存储过程
–triggers 触发器
-E,–events 调度事件
mysqldump还有几个参数常用:
–hex-blob
–tab=path mysql
-w,–where=’过滤条件’ 只能在单表使用
具体操作步骤:
创建一个备份账号
create user 'backup'@'localhost'identified by '123456';
授权
grant select,reload,lock tables,replication client,show view,event,process *.* to 'backup'@'localhost';

全备:是在shell下进行的,进入data目录进行备份。
在data目录下的db_backup目录下进行备份:
mysqldump -ubackup -p --master-data=2 --single-transact -routines --triggers --events mc_orerdb > mc_orderdb.sql
虽然现在没有使用存储过程,触发器,调度事件,但是为了可能以后会使用到,所以这里也使用了相应参数。
查看备份内容是否包含了所有的表:
grep "CREATE TABLE" mc_orderdb.sql
这样就可以看到所包含的表
备份单个表
mysqldump -ubackup -p --master-data=2 --single-transact -routines --triggers --events mc_orerdb order_master> mc_orderdb.sql
如果要备份多个表 在后面加就可以了 用空格进行分割
对一个mysql实例下的所有数据库进行全量备份
mysqldump -ubackup -p --master-data=1 --single-transact -routines --triggers --events --all-database> mc.sql
使用-tab参数备份数据库:
在tmp目录下建立一个子目录
mkdir -p /tmp/mc_orderdb
然后
mysql -uroot -p
添加一个写数据的权限:
grant file on *.* to 'backup'@'localhost';
接下来返回shell

mysqldump -ubackup -p --master-data=2 --single-transact -routines --triggers --events --tab="/data/db_backup/mc_orderdb" mc_orderdb

使用where参数
对订单id在1000-1050间的主表数据进行修改,修改之前要先备份,进入db_backup目录下执行

`mysqldump -ubackup -p --master-data=2 --single-transact -routines --triggers --events where "order_id>1000 and order_id<1050' mc_orerdb order_master> order_master1000.sql`

在日常工作中我们不能每次都手工对数据库备份,所以可以用脚本。需要备份的时候运行脚本就可以了。可以让脚本定时运行,这样就可以了。
恢复mysqldump备份的数据库
mysql -u -p dbname < backuo.sql
mysql>source/temp/backup.sql
全备恢复
先在db_backup目录下建立一个数据库:mysql -uroot -p -e"create database bak_orderdb"
然后导入备份文件:mysql -uroot -p bak_orderdb < mc_orderdb.sql
利用备份数据库恢复删除的数据

INSERT INTO mc_orderdb.'order_master'(...)
SELECT a.* FROM bak_orderdb.'order_master' a LEFT JOIN mc_orderdb.'order_master' b ON a.order_id=b.order_id,WHERE b.order_id IS NULL

对于静态数据库才能这样进行,对于时刻有数据在写的数据库就不能这样还原了。
使用-tab参数把每个表备份到两个单独文件中
刚才使用-tab把数据备份到了tem目录下的mc_orderdb的子目录中,这些就是刚才使用-tab来备份的结果集,要利用这个结果集来操作,要进入mysql客户端中,把结果集恢复到crn库中,
使用source /tmp/mc_orderdb/region_info.sql;
使用load data infile 'tmp/mc_orderdb/region_info.txt' inti table region_info
然后可以看一下当前表的数据量 select count(*) from crn.region_info;
如果每一个数据库很大,对某一个数据库全备后只想对某一个表进行恢复的话,使用-tab参数明显效率更高。
接下来是如何进行指定时间点的恢复
进行某一时间点的数据恢复,恢复到误操作的时间
先决条件:具有指定时间点前的一个全备,具有自上次全备后到指定时间点的二进制日志。
恢复步骤
接下来统计一下每一个用户的消费金额并插入都t表中。
insert into t(uid,cnt) select customer_id,sum(order_money) from order_master group by customer_id
模拟误删除操作:delete from t limit 100
恢复:
把刚刚备份的文件导入到数据库中,先进行全量的数据库恢复
mysql -uroot -p mc_orderdb < mc_orderdb.sql
完成之后查看一下备份时候的mysql日志的文件名和时间点:more mc_orderdb.sql
通过CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000011'
可以查看到它的二进制日志是在这个000011号文件上,MASTER_LOG_POS=84882可以看到日志点是84882,然后我们要恢复这个之后,删除之前的数据。
查看删除数据的时间点
然后就可以看到二进制日志中所进行的操作,找到刚刚的DELETE操作,结束点end_log_pos是169348,所以我们要恢复的是84882-169348日志点之间的数据,通过mysqlbnlog命令:
mysqlbinlog --start-position=84882 --stop-position=169348 --database=mc_orderdb mysql-bin.000011 > mc_order_diff.sql
接下来使用mysql客户端进行导入
mysql -uroot -p mc_orderdb < mc_order_diff.sql
接下来查看数据
mysql -uroot -p use mc_orderdb select count(*) from t
可以看到数据已经恢复成功。
基于时间点的恢复总结
具有指定时间点前的mysqldump的全备
具有全备到指定时间点的mysql二进制日志
实时二进制日志备份
mysql5.6之后提供了一个很好的 工具来进行二进制备份,在备份之前需要的配置:
首先要新建一个用户,这个用户要有REPLICATION SLAVE 的权限,
建立一个用户:grant replication slave on *.* to 'repl'@'ip' identified by 'xxxxx';
建一个用于备份的目录:mkdir -p binlog_backup
再执行命令:mysqlbinlog --raw --read-from-remote-server\ --stop-never --host localhost --port 3306\ -u repl -p xxx二进制日志名
实际操作:
在实际中应该通过远程进行二进制日志备份,这是只要把localhost改为相应的备份服务器的ip就可以了
首先要看一下当前服务器上所有的二进制日志有哪些ls -lh /home/mysql/sql_log
然后创建备份目录 mkdir binlog_bal cd binlog_bak
从第十号日志开始备份

mysqlbinlog --raw --read-from-remote-server --stop-never --host localhost --port 3306 -u repl -p123456 mysql-bin.000010

这个命令会持续在后台运行,此时进入binlog目录下可以看到已经有日志了。

xtrabackup备份工具
用于在线备份innodb存储引擎的表
只会备份数据文件,不会备份表的结构
innobackupex是对xtrabackup的封装并提供MyISAM表的备份功能,但也会锁表,是xtrabackup的插件。
下载xtrabackup地址
在安装xtrabackup之前,还需要安装一些支持库:

yum install -y perl-DBD-MySQL.x86_64 perl-DBI.x86 perl-Time-HiRes.x86_64 perl-IO-Socket-SSL.noarch perl-TermReadKey.x86_64

使用rpm命令安装软件包

rpm -ivh 包名

安装后进入/usr/bin目录ls -lh xtrabackup ls -lh innobackup可以看到有这两个命令就是安装成功了
利用xtrabackup进行全备

innobackupex --user=backup --password=pwd\ --parallel=2 /home/db_backup/

–parallel可以用来指定在备份时的线程数,这样会大大提高效率

利用innobackupex进行全备恢复
innobackupex –apply-log /path/to/BACKUO-DIR
mv /path/to/BACKUO-DIR /home/mysql/data
利用数据库目录进行恢复,先用mv命令把目录复制到mysql的数据库目录下,
先把当前的mysql 数据库stop掉,然后下一步就可以把当前的数据库目录改名为databack 还有要改一下数据库的所有者。
利用xtrabackup进行增量备份
innobackupex –user=root –password=pwd/backups
示例

innobackupex --user=root --password=pwd\
--incremental/homt/db_backup/ \
--incremental-basedir=/home/db_backup/back_dir

innobackupex –user=root –password=pwd\
–incremental/homt/db_backup/ \
–incremental-basedir=上一次增量备份的目录
增量备份会把上一次全备后的记录变更记录下来
利用innobackupex进行增量备份恢复
1、

innobackupex --apply-log --redo-only 全备目录

2、下面对第一次增量备份产生的log应用一下redo log

innobackupex --apply-log --redo-only 全备目录\  ----incremental-basedir=第一次增量备份的目录

3、恢复

innobackupex --apply-log  全备目录\

4、把恢复目录拷贝到mysql目录下,stop当前数据库示例,把刚才的数据库目录删除掉,把备份数据目录改成data目录,然后把目录属主改成mysql,然后对mysql示例重启
`
mv /path/to/BACKUO-DIR /home/mysql/data

制定项目备份计划
每天凌晨对数据库进行一次全备
实时对二进制日志进行远程备份

三、小结

Mysqldump全备总结
常用参数
如何利用mysqldump进行全库及部分库表的备份
如何利用备份文件进行恢复
对mysql二进制日志进行实时备份

xtrabackup备份总结
使用xtrabackup进行全备和恢复
使用xtrabackup进行增量备份和恢复
这段内容有很多我都不太懂还需要多加练习。

猜你喜欢

转载自blog.csdn.net/qq_40916110/article/details/80666615