ITPub博客

首页 > Linux操作系统 > Linux操作系统 > [转载] 数据库的备份与恢复概论

[转载] 数据库的备份与恢复概论

原创 Linux操作系统 作者:tolywang 时间:2009-01-13 17:41:57 0 删除 编辑
这是一遍综合性描述数据库备份的文章,要把所有的数据库的备份与恢复全部描述清楚,不是我这遍文章的初衷。我只想给那些想做备份。却不怎么了解备份的人一个整体认识。本人的水平是有限的。我只能抛砖引玉。很多经验总结也是个人一家之言。有错误请斧正。(邮件地址tanfufa@geong.com

一:数据库备份的重要性

硬件总会坏,系统总会崩溃的,数据文件总是会损坏的,人也不可能永远不犯错误的。数据库备份就是在你硬盘坏了。系统崩溃坏了。数据文件损坏了,工作人员误删除数据的时候让你不伤心,不害怕。数据库的备份不同与一般的文件备份。一个备份方案总是跟客户的需求有关系的,一个从来没有新数据增加的查询数据库。一次冷备份就足够了。而对一个7X24小时数据库。数据不能丢失的系统。备份的方案就复杂多了。怎么样才能保证数据库不丢失数据呢?这将受到两个条件的制约。一:数据库种类。二:备份的方法。

二:数据库备份与恢复种类

2.1逻辑备份与恢复
逻辑备份是使用软件技术从数据库中提取数据并将结果写入一个输出文件,逻辑备份因为灵活性受到开发人员的青睐。但是对一个数据库管理员来说。就对它不放心了。一:他是点的逻辑。他只能描述数据库在一点上逻辑结构。然后抽取这些逻辑对象写入到一个或者多个输出文件。一般一个完整的备份是一个点另一个点(终止点)的连续发生。逻辑备份是不可能记录连续发生的事情的过程的。

2.2冷备份与恢复
冷备份。又叫脱机备份。就是停掉数据库服务。拷贝数据库数据目录。一般是 data 目录。Oracle 一般是oradata目录。Mysql ,postgres 都是data目录。而且这些默认举例说明。在实质的生产中这些目录文件是变化的。不过不用担心。数据库管理员肯定知道在那里。具体他怎么知道。不同数据库有不垃圾广告法。不是本文的重点。为什么要把数据库停掉。才能做数据拷贝?我直接在数据库运行的时候拷贝不一样吗?如果你运气好的好。那样确实也可以。不过不要因为运气。就证明你可以那样做。其实一件事物不但要有证据去证明他。就是还需要一个明确的理论去支持他。不然是容易犯经验主义错误的。一个数据块正被复制。然后他或许前半部分是修该前。后半部分是修改后的。这就是split data .但数据库启动时候,数据库读到这样的数据库块就迷糊了。数据库不一致的错误就出来。数据库肯定提示要你恢复。数据库备份一定要遵循数据库的一致性。

2.3热备份与恢复
热备份也叫在线备份。什么在线备份,就是数据库在运行的时候一种物理备份。(如果是逻辑的不能叫在线备份。)。不同数据库在线备份都不同。数据库要能热备份。都需要开启数据库归档模式。并设置归档路径。但是有数据库。特别开源数据库对这方面做的非常不好。Postgres 7.3后才有 在线备份。Mysql更是乱的。一个引擎一个种方式。而且有的还不是免费的。怪的很。商用性软件oracle,db2 ,Informix ,就做的好的多。归档究竟有什么意义?如果说逻辑备份是一张照片或者素描,他记录的是点的真实反映或者逻辑印象,那么归档就是录象带。他记录的是一个连续发生的事物的过程。一个开始点的全备份+这个点后的归档+完好的在线redo。那么在这个全备份后所有时间都是可以回放的。

三:各数据库的备份恢复对比(以下每种数据库每种备份都可以写一本书,在这里不详细叙述,只概括其作用,在《数据库备份与恢复》中详细阐述)。(由于第三方备份软件比较,在这个不讨论第三方的问题)。

数据库名


备份


Oracle


逻辑备份


9i以前 exp/imp
9i后:
一:exp/imp 具体使用也不是本问的初衷
逻辑备份。可以备份单个表。逻辑查询语句记录,模式,整个数据库,创建对象语句不包括数据等。花样繁多。不一一列举。
二:expdp/impdp(具体怎么使用也不是本问的初衷)
oracle Database 10g引入了最新的数据泵(Data Dump)技术,使DBA或开发人员可以将数据库元数据(对象定义)和数据快速移动到另一个oracle数据库中.
数据泵导出导入(EXPDP和IMPDP)的作用
1,实现逻辑备份和逻辑恢复.2,在数据库用户之间移动对象.3,在数据库之间移动对象
4,实现表空间搬移.
与exp/imp的区别
expdp/impdp与传统exp/imp的速度相比:要快10的2次方以上。
EXP和IMP是客户端工具程序,它们既可以在可以客户端使用,也可以在服务段使用.
EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用
IMP只适用于EXP导出文件,不适用于EXPDP导出文件;IMPDP只适用于EXPDP导出文件,而不适用于EXP导出文件.
数据泵导出包括导出表,导出方案,导出表空间,导出数据库4种方式.
逻辑备份优点与缺点:
优点:方便,灵活,不受操作系统,数据库版本等限制。适合处理小数据量,特别适合开发人员迁移数据库。
缺点:有数据库丢失。不能实时。速度慢。

冷备份


冷备份又叫脱机备份。就是停数据库服务。然后Copy datafile,controlfile,spfile,passwdfile。恢复过程也很简单。把相关文件拷贝到相关目录。建立实例。启动数据库既可。


热备份


Oracle 热备份条件:1.必须起用数据库归档模式。
热备份可以备份一个数据文件,一个表空间,一个数据库等。
热备份备份方式:一:Oracle 备份工具:之 rman
恢复管理器(Recovery Manager, RMAN)是一个与操作系统无关的数据库备份工具,可以跨越不同的操作系统进行数据库备份。RMAN必须运行在一个数据库上。与常用的数据库备份、逻辑数据库备份不同,RMAN使用数据库对数据库进行备份的原理。
RMAN中,可以使用COPY命令将数据库文件复制到磁盘或磁带上,也可以用BACKUP命令对整个数据库、一个指定的表空间、控制文件、日志文件进行备份
备份方式:
1:full 全备份, 2: 0级 增量全备份,他与full备份的区别是可以在这个全备份上做增量备份。而full全备份不可以。 3:1 级增量备份。4:2级增量备份 5:三级增量备份。详细过程不多说。见详细文档)。
二:普通的热备份: alter database begin backup;(9i无),只有alter tablespace begin backup;然后拷贝文件。
重点注意:一旦把数据库,或者表空间,数据文件处于备份状态。用copy命令拷贝完成后。一定要alter database end backup; alter tablespace  end backup;把数据库或者表空间处于正常状态。


Db2


逻辑备份


Db2loook 导出创建对象的ddl语句。
db2move 导入/导出对象的数据。
如:
1.db2look -d  YOURDB  -a -e -x -o creatab.sql 导出建库表的SQL
2.db2move   YOURDB  export
3.vi   creatab.sql 如要导入的数据库名与原数据库不同,要修改creatab.sql中CONNECT 项 如相同则不用更改
4.执行脚本:db2 -tvf creatab.sql
5.db2move  NEWDB  load (在该目录执行db2move 命令)
注:由于某些表数据违反了唯一约束。外键约束可能会有错误出现。不过出错没有关系。可以把出错的表单独处理。

冷备份


  1)、首先确保没有用户使用DB2db2 list applications for db sample
  2)、停掉数据库并重新启动,以便断掉所有连接:1.db2stop 2.force db2start
  3)、执行备份命令:(使用TSM作为备份的介质)db2 backup db sample use tsm 备份成功,将会返回     一个时间戳。
  4)、检查备份成功:Db2 list history backup all for sample ,可以看到多了这个备份的纪录           Db2adutl query命令也可以看到返回值。
  5)、备注:离线备份最重要的就是要数据库在offline 做.就是数据库在离线的状态.

热备份


1)、首先打开一下支持在线备份的数据库配置参数:
8.2以前备份:
db2 update db cfg for sample using userexit on 启用用户出口
db2 update db cfg for sample using logretain on 启用归档日志
db2 update db cfg for sample using trackmod on 启用增量备份功能
8.2以后
db2 update db cfg for sample using LOGARCHMETH1=.../db2/backup/(常用办法)
(需要各个Node都分别做设置)开启这些参数后,数据库处于backup pending状态,要求做数据库的离线全备份。做一下离线全备份,参考上面的命令。
2)、在线备份命令如下:db2 backup db sample online use tsm备份成功,返回一个时间戳。
3)、同样可以用db2adutl 和db2 list history察看备份纪录。
4)、备注:同样,对每个节点都做这个操作。
3、 在线增量备份
1)、在开启了必须的三个参数的情况下,做增量备份:

db2 backup db sample online incremental use tsm备份成功,返回一个时间戳。


2)、同样可以用db2adutl 和db2 list history察看备份纪录。
3)、还有一种delta的备份:db2 backup db sample online incremental delta use tsm

这两种备份的区别,类似Oracle Exports的Incremental和Cumulative方式,


db2的incremental对应.oracle的cumulative方式,而db2的delta方式则对应oracle的incremental方式。
4)、备注:同样,对每个节点都做这个操作。


postgresql


逻辑备份


逻辑备份
1Pg_dump 如:pg_dump dbname > outfile(导出单个数据库)
2pg_dumpall 如: pg_dumpall

> outfile(导出所有数据库)
3.处理大数据库:

3.1:pg_dump dbname | split -b 1m – dbname (备份分片)
3.2:pg_dump dbname | gzip > filename.gz(备份压缩)
逻辑恢复
1pg_dump -h host1 dbname | psql -h host2 dbname从一个数据库备份恢复到另一个数据库)
2psql dbname < infile(直接恢复)
3. cat filename.gz | gunzip | psql dbname(压缩恢复)

冷备份


另一个备份的策略是直接拷贝PostgreSQL用于存放数据库数据的文件。 也叫冷备份。是数据块的备份。tar -cf backup.tar /usr/local/pgsql/data  为了进行有效的备份,数据库服务器必须被关闭。象拒绝所有联接这样的折衷的方法是不行的,因为总是有一些缓冲区数据存在。 (主要因为 tar 和类似的工具在做备份的时候并不对文件系统的状态做原子快照)。 如果你曾经深入了解了数据库在文件系统布局的细节,你可能试图从对应的文件或目录里备份几个表或者数据库。 这样做是没用的,因为包含在这些文件里的信息只是部分信息。还有一半信息在提交日志文件 pg_clog/*里面,它包含所有事务的提交状态。 只有拥有这些信息,表文件的信息才是可用的。当然,试图只恢复表和相关的 pg_clog 数据也是徒劳的,因为这样会把数据库集群里的所有其他没有用的表的信息都拿出来。 所以文件系统的备份只适用于一个数据库集群的完整恢复。

热备份


PITR 的全称是 Point In Time Recovery, 它结合文件系统级备份 WAL 日志文件, 达到在线增量备份 PostgreSQL 数据库系统. WAL 的全称是 Write Ahead Log, 它记录着数据库修改数据文件的每一个动作. 如果系统挂了, 读入这些日志文件可以很方便快捷安全的恢复数据. 他是数据块的备份。非逻辑备份。
在这里我写一个例子来说明:(postgres 故意写的详细点了,自己本来也对postgres也不熟悉,就当练习了)。
备份
1.建立备份目录. 备份分基线 (baseline) 和日志备份, 所以我们要建立两个目录:
mkdir -p /opt/backupbase
mkdir -p /opt/archive
接着我们设定一些环境变量及备份所在目录:
export PGDATA=/home/postgres/pgdata
export BACKBASE= /opt/backupbase
export ARCHIVE= /opt/archive
2.设置完上面那些变量后, 编辑 $PGDATA/postgresql.conf 文件, 设置如下:
archive_mode = on
archive_command = 'cp %p  /opt/archive/%f'
所有设置都完成了, 启动或重启 PostgreSQL 服务.
3.做一个全库备份。(增量备份的基准点)。
psql -d dbname -c "select PG_START_BACKUP('backup baseline')"
cp -R $PGDATA/* $BACKBSE
psql -d template1 -c "select PG_STOP_BACKUP()"
4.基线备份好后, 就可以时不时的备份日志了, 命令如下:
cp -R $PGDATA/pg_xlog/* $ARCHIVE(crontab 定时执行,目的为了减少数据丢失。(linux unix下))或者把wal在线日志处于冗于磁盘上。)日志备份尽可能的频繁一些. 因为当线上提供服务的所在磁盘坏掉, 而你又没有备份 WAL 日志, 你会丢数据.

恢复
1.把 baseline 的备份拷贝到新建的数据库一样的/home/postgres/pgdata 目录下.
接着呢, 为了避免恢复还响应连接请求什么的, 我们把服务只开启本地连接,
2.修改 $PGDATA/postgresql.conf 文件:
listen_addresses = 'localhost'
3.再下来, 在 $PGDATA 目录下创建一个 recovery.conf 文件. PostgreSQL 启动的时候如果发现 $PGDATA 目录里面有这个文件就会进入恢复模式, 恢复完后会把这个文件重命名为 recovery.done. 文件内容只有一行, 如下:
restore_command='cp /opt/archive/%f
%p'
注意这里是单引号, 别用双引号, 不然会提示错误.
启动数据库:
4.pg_ctl start -D $PGDATA -l /tmp/pg.log
这个时候观察 /tmp/pg.log 文件, 会发现正在恢复一个一个的 WAL 日志文件。
最后, 恢复完后, 再把 $PGDATA/postgresql.conf 文件中的 listen_addresses 改回来:重启:
pg_ctl restart -D $PGDATA -l /tmp/pg.log

Mysql




mysqlhotcopy
其命令格式如下(摘自MYSQL文档):
shell> mysqlhotcopy db_name /path/to/some/dir
只要服务器不再进行更新,还可以只复制所有表文件(*.frm、*.MYD和*.MYI文件)。mysqlhotcopy脚本使用该方法。(但请注意如果数据库包含InnoDB表,这些方法不工作。InnoDB不将表的内容保存到数据库目录中,mysqlhotcopy只适合MyISAM表)。
mysqldump
mysqldump提供在线逻辑备份,我们在备份的时候使用single-transaction参数的话,MYSQL为我们提供一致性地读,并且保证mysqldump所看见的数据不会更改。(其它客户端对InnoDB表进行的更改不会被mysqldump进程看见)该参数自动关闭--lock-tables。如果我们还有其它类型的表,我们必须假定在备份过程中它们不会更改。例如,对于mysql数据库中的MyISAM表,我们必须假定在备份过程中没有对MySQL账户进行管理更改。mysqldump命令产生的.sql文件包含一系列SQL INSERT语句,可以用来重载转储的表。

这里只简单说明一下,详细见以后阐述。

Informix






Sqlserver






其他





来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-538070/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle , MySQL, SAP IQ, SAP HANA, PostgreSQL, Tableau 技术讨论,希望在这里一起分享知识,讨论技术,畅谈人生 。

注册时间:2007-12-10

  • 博文量
    5595
  • 访问量
    13364320