备份与还原
来源:互联网 发布:linux查看hba卡信息 编辑:程序博客网 时间:2024/06/05 01:53
备份与还原
恢复:从备份记录中获取数据,加载到MySQL里还原:描述救援整个系统或系统一部分的过程
常规事项:
1.裸备份对于大型数据必要的。运行速度快。常选择的是基于快照的备份,如果是InnoDB,使用InnoDB热备份2.备份用于即使点还原的二进制日志
3.多保留几个备份记录,二进制日志要足够长
4.定期测试备份/还原过程
5.创建逻辑备份(如果基于裸备份会比较好)
6.如果可能,需要测试一下裸备份
7.需要考虑安全问题
8.使用备份工具监控备份记录和备份过程
9.灵活运用机器间复制文件的方法
权衡的事项:
1.能承受的损失2.在线备份还是离线备份。离线备份简单,安全,但关闭和启动高负载大数据的MySQL耗费的时间比较长。在线备份可以在复制从服务器上做,做在线备份时,要不影响到服务器上的服务,很难做到
3.逻辑备份还是裸备份。
逻辑备份优点:
1.普通文件
2.容易恢复
3.可以跨网络进行备份和恢复
4.很强的兼容性
5.独立于具体的存储引擎
6.避免数据损坏
缺点:
1.服务器必须亲自生成,使用多的CPU周期
2.可能会被原数据更大
3.浮点数会丢失精度信息
4.从逻辑备份中恢复数据需要MySQL加载和解释声明,重建索引,增加额外工作量
最大的不利因素是从MySQL导出数据的开销和使用SQL把数据导回去的开销
裸备份优点:
1.只需要复制文件
2.备份的数据更加简单,innoDB需要先关闭MySQL服务器
3.便于跨平台,操作系统和MySQL版本
4.数据恢复更快
缺点:
1.InnoDB裸文件比相应的逻辑文件大
推荐的方法:先做裸副本,然后开启MySQL服务器,在副本的基础上生成逻辑备份。如果有文件系统快照的功能,可以先做一个快照,把快照复制到另一台服务器上释放,测试这些裸文件,做逻辑备份
备份内容
1.二进制日志,InnoDB事务日志2.代码,包括触发器,存储过程
3.复制配置信息,比如二进制日志,转发日志,日志索引文件及.info文件。至少包含SHOW MASTER STATUS/SHOW SLAVE STATUS 的输出内容
4.服务器配置信息
5.操作系统文件
增量备份
1.备份二进制日志2.只备份二进制日志里变化部分
3.只备份数据文件变化部分
数据还原时复杂性会提高
存储引擎和一致性
数据一致性:备份的时候,必须保证数据在即使点上是一致的文件一致性:备份的文件要保持一致性。MyISAM,需要LOCK TABLES/FLUSH TABLES或者FLUSH TABLES WITH READ LOCK,刷新缓存,然后取得MyISAM文件的裸备份。InnoDB,不仅要确保文件内部一致性,还要在同一时刻复制日志文件和表空间文件,即使使用FLUSH TABLES WITH READ LOCK,InnoDB仍会在后台运行:插入缓冲区,日志和写线程继续把数据更新写到日志和表空间。
解决办法:1)等到InnoDB里清除线程和插入缓冲区线程退出 2)利用LVM对数据和日志文件做一致性快照
管理和备份二进制日志
二进制日志的服务器配置:log_bin = mysql-bin
sync_binlog = 1
innodb_support_xa = 1
数据备份
逻辑备份:
1)SQL导出:使用mysqldump。缺点:1.样式和数据存放在一起,单一文件恢复比较方便
2.执行,解析所有的SQL语句工作量很大
3.生成的单一文件很大
4.成本昂贵
2)使用定界符文件备份:使用SELECT INTO OUTFILE。文件里数据用ASCII表示的裸数据
SELECT * INTO OUTFILE '/tmp/t1.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY ' " '
LINES TERMINATED BY '\n'
FROM test.t1;
使用LOAD DATA INFILE导入
LOAD DATA INFILE '/tmp/t1.txt'
INTO TABLES test.t1
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY ' " '
LINES TERMINATED BY '\n';
局限性:只能在MySQL运行的机器上把数据备份到一个文件里,MySQL必须有权限访问要生成文件的那个目录,无法导出一个压缩文件,不能覆盖已存在的文件
文件快照系统:
有快照功能的文件系统能够在瞬间将它的内容做一个一致的镜像,镜像可以用来做备份。做一个快照只是减少锁定时间的一个简单手段,在释放锁之后,把这些文件复制到备份去。
LVM快照:使用写时复制创建快照,即时获得全部卷的一个逻辑副本。LVM只简单标注一下做快照的时间,不把数据复制到快照里,需要数据时,才从数据来源的卷里读出来。数据发生改动时,受到影响的数据块复制到存储区域里,每一个数据库只有在第一次写入时才会触发写时复制,从而把数据复制到保留区域里。读取快照里已被复制过的数据块时,LVM会从保留存储区域里读取数据。需要足够的空间保存来源卷数据更改时要复制的数据块。
先决条件:
1.所有InnoDB文件在一个逻辑卷里
2.如果需要备份表定义,MySQL数据目录必须在同一个逻辑卷里
3.分卷组里必须有足够的空闲空间来创建快照
创建快照
lvcreate --size 16G --snapshot --name backup_mysql /dev/vg/mysql
lvs查看最近分卷状态
挂载快照
mkdir /tmp/backup
mount /dev/mapper/vg-backup_mysql /tmp/backup
ls -l /tmp/backup/mysql
卸载快照
umount /tmp/backup
rmdir /tmp/backup
lvremove --force /dev/vg/backup_mysql
在线备份InnoDB
先FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;
记录SHOW MASTER STATUS的输出信息,确认连接着MySQL和没有释放掉锁。
做LVM快照,然后使用UNLOCK TABLES或者关闭数据库连接把锁释放掉
把快照挂载接上,复制里面的文件到备份位置上
可以做InnoDB的无锁快照
就是不用先FLUSH TABLES WITH READ LOCK;但必须在InnoDB里数据和日志文件一起做快照
规划LVM备份
1.LVM只把更新的数据块复制到快照里一次
2.InnoDB的写入数据会对快照建立初期有影响
3.在数据块被复制到快照之前,估计数据块写入时I/O的数量
4.使用vmstat,iostat获取统计信息,获知服务器在每一秒里写多少个数据块
5.测量把备份复制到别的位置上花费的时间
从备份中还原
可能的步骤:1.关闭MySQL服务器
2.在服务器配置和文件权限上做好记录
3.把数据从备份记录到MySQL数据目录下
4.更改配置,文件权限
5.在有限访问权下重启服务器,然后等它完全启动
6.重新加载逻辑备份文件
7.检查和重放二进制日志
8.核实恢复出来的内容
9.使用完全访问重启服务器
1.还原裸文件
MyISAM不需要关闭服务器,只要复制每个表的.frm,.MYI,.MYD,在复制表文件之前,应该把打开的表删除,或者重命名,或者使用LOCK TABLES 和 FLUSH TABLES关闭InnoDB需要先关闭MySQL,把复制文件移到其他地方,然后重启MySQL,还要确认事务日志文件与表空间文件是相匹配的
在启动MySQL之前,需要检查服务器配置,确定还原的文件有正确的owner和权限,也需要查看MySQL的错误日
志
2.还原逻辑文件
加载SQL文件mysql < backup.sql
也可以使用SOURCE,关闭日志,加载文件时,不要重新启动MySQL服务器
SET SQL_LOG_BIN = 0;
SOURCE backup.sql;
SET SQL_LOG_BIN = 1;
最好把每个表备份到自己的文件里
如果压缩了备份记录:gunzip -c backup.sql.gz | mysql
加载定界符文件
使用LOAD DATA INFILE或者mysqlimport
解压缩的优化:建立命名管道和流,把数据压缩到里面
mkfifo /tmp/backup/backup.fifo
chmod 666 /tmp/backup/backup.fifo
gunzip -c /tmp/backup/backup.txt.gz > /tmp/backup/backup.fifo
加载文件
SET SQL_LOG_BIN = 0;
LOAD DATA INFILE '/tmp/backup/backup.fifo'
INTO TABLE backup;
3.即时点还原(例子)
备份复制(myISAM):FLUSH TABLES WITH READ LOCK;cp -a /var/lib/mysql/sakila /backup/sakila;
FLUSH LOGS;
mysql -e "SHOW MASTER STATUS" --vertical > /backup/master.info;
UNLOCK TABLES;
还原:
1./etc/init.d/mysql stop
mv /var/lib/mysql/sakila /var/lib/mysql/sakila.tmp
cp -a /backup/sakila /var/lib/mysql
2.在my.cnf加入:skip-networking
socket=/tmp/mysql_recover.sock
3./etc/init.d/mysql start
4.mysqlbinlog --database=sakila /var/log/mysql/mysql-bin.000215 | grep -B 3 -i 'drop table
sakila.payment'
5.mysqlbinlog --database=sakila /var/log/mysql/mysql-bin.000215 --stop-position=352 | mysql -
uroot -p
mysqlbinlog --database=sakila /var/log/mysql/mysql-bin.000215 --start-position=429 | mysql -
uroot -p
6.检查确保结果正确,关闭服务器,把my.cnf配置改回来,重启服务器
4.InnoDB还原
InnoDB每次启动时检查数据和日志文件,确定是否需要还原,根据日志里事务状态,把数据更新到数据文件或者回滚InnoDB损坏问题与硬件相关联。常见配置不当是RAID卡开启了writeback缓存,而RAID卡没有后备电源,或者磁盘驱动器上开启了writeback缓存。会导致控制器或驱动器谎报fsync()已经完成,实际上数据还在writeback缓存里,而不是磁盘上。
还原InnoDB:
1.二级索引损坏,可以使用OPTIMIZE TABLE,或者SELECT INTO OUTFILE,然后删除并重建表,最后使用LOAD DATA INFILE
2.集群索引损坏,可能用innodb_force_recovery设置来导出表
3.系统结构损坏,可能需要做整个库的导出和还原
备份工具
1.mysqldump
mysqldump --host=server1 test t1 | mysql --host=server2 testmysqldump --all-database > dump.sql
mysqldump --database sakila > dump.sql
mysqldump sakila actor > dump.sql
mysqldump sakila actor --result-file=dump.sql
常用选项:--opt --lock-all-tables
逻辑备份,速度慢
2.mysqlhotcopy
perl脚本,为MyISAM设计3.InnoDB热备份(ibbackup)
不用停止MySQL,设置锁提供一个与服务器上my.cnf相匹配的文件,放在不同目录下。把InnoDB文件从服务器复制到第二个配置文件指定的位置上:ibbackup /etc/my.cnf /etc/ibbackup.cnf
还原备份时,先关闭MySQL:ibbackup --restore /etc/ibbackup.cnf
只复制了InnoDB文件
裸备份,速度快
- SQLserver备份与还原
- 备份与还原
- 备份与还原数据库
- 数据库备份与还原
- 数据库备份与还原
- oracle 备份与还原
- IIS备份与还原
- 数据库备份与还原
- 数据库备份与还原
- mysql备份与还原
- SqlServer 备份与还原。
- 备份与还原
- 数据库备份与还原
- SQL备份与还原
- 数据库备份与还原
- 数据库备份与还原!
- SVN备份与还原
- mysql 备份与还原
- Verilog HDL in one day Part-III
- Robberies
- 看懂信息检索和网络数据挖掘领域论文的必备知识总结
- 全排列算法c++实现
- 记录几个常用的批处理文件
- 备份与还原
- VMWare虚拟机设置固定ip上网方法
- 第三章 面向对象编程基础知识
- 数据库知识梳理
- ACM题 蛇形矩阵
- SimpleHTTPServerWithUpload.py
- 天易21----jquery实现简单的表单验证
- 第四章 继承
- 解决MyEclipse吃内存,让MyEclipse飞起来,MyEclipse速度