DBASK-数据库管理员结构化知识体系-Structured knowledge system for DataBase Administrators

Home

SAP

SAP ASE数据库备份与恢复

数据库备份




遇到介质故障(如磁盘崩溃)时,仅当您有数据库的定期备份及其事务日志的情况下才可恢复这些数据库。完整恢复依赖于定期使用 dump database 和 dump transaction 命令备份数据库以及使用 load database 和 load transaction 命令恢复它们。

切勿使用操作系统复制命令复制操作数据库设备。对复制的设备运行 Adaptive Server 可能导致数据库损坏。关闭 Adaptive Server,或者使用 quiesce database 命令保护复制操作。

如果直接转储到磁带,则不要在该磁带上存储任何其它类型的文件(UNIX 备份、目标文件,等等)。如果不这样,将使 Sybase 转储文件失效。但是,如果转储到 UNIX 文件系统,则可以将结果文件存档到磁带中。

建议:在备份数据库之前,请使用 dbcc 命令检查它的一致性。

进行例行数据库转储:dump database




dump database 命令可复制整个数据库,包括数据和事务日志。

dump database 不会将日志截断。

dump database 允许动态转储,这意味着,用户可以在执行转储时继续更改数据库。因此,可以方便地定期备份数据库。

进行例行事务日志转储:dump transaction




使用 dump transaction 命令可定期备份事务日志。dump transaction 类似于许多操作系统提供的增量备份。它复制事务日志,并提供自上一次事务日志转储以来对数据库所进行的所有更改的记录。dump transaction 复制完日志后,会截断其中不活动的部分。

dump transaction 比完全数据库备份所花费的时间和存储空间要少,一般更为经常使用。用户可以在转储数据库时继续对该数据库进行更改。只有在数据库将其日志存储在单独的段上时,才可运行dump transaction。

遇到介质故障后,使用 dump transaction 的 with no_truncate 选项备份事务日志。这样,可提供一直到发生故障时的事务日志的记录。

设备出现故障后复制日志:dump tran with no_truncate




如果数据设备出现故障,并且数据库不可访问,则使用 dump transaction 的 with no_truncate 选项获取日志的当前副本。此选项不会截断日志。仅当事务日志在一个单独的段上,且 master 数据库可访问的情况下,才可使用此选项。

恢复整个数据库:load database




使用 load database 命令可装载使用 dump database 创建的备份。可以将转储装载到先前存在的数据库中,或使用 for load 选项创建一个新数据库。创建新数据库时,所分配的空间至少要与分配给原始数据库的空间相等。

将更改应用到数据库:load transaction




装载数据库之后,使用 load transaction 命令按各个事务日志转储的创建顺序装载它们。此进程通过重新执行事务日志中记录的更改来重建数据库。如有必要,可以通过使用 load transaction 的 until_time选项将数据库向前滚动到其事务日志中某个特定时间,开始恢复数据库。

在 load database 和 load transaction 命令之间,用户不能对数据库进行更改,因为 load database 已将状态设置为“脱机”。

您只能装载与相关数据库位于相同释放级别的事务日志转储。

装载完事务日志转储的整个序列后,数据库会显示上一次事务日志转储时提交的所有事务。

使用户可以使用数据库:online database




当装载序列完成后,将数据库的状态改为“联机”,以便用户可以使用数据库。除非发出 online database 命令,否则仍旧无法访问由load database 装载的数据库。

在发出 online database 之前,一定要装载全部所需的事务日志。

跨平台转储和装载数据库




Adaptive Server 允许您跨体系结构规模不同的平台转储和装载数据库。这意味着您可以从大型平台到小型平台,或从小型平台到大型平台执行 dump database 和 load database。

在大型系统中,存储类型(如整型或长整型)的最重要字节在较低地址空间。反之,对于小型系统,存储类型的最重要字节在较高地址空间。

跨平台转储数据库步骤




对于跨平台的转储和装载,在运行 dump database 之前,请使用以下过程将数据库的状态更改为事务性抑制状态:

1 执行 dbcc checkdb 和 dbcc checkalloc 以检验数据库是否在顺利运行。

2 使用 sp_dboption 将数据库置于单用户模式。

3 使用 sp_flushstats 将统计数据刷新为 systabstats。

4 等待 10 到 30 秒钟,该时间的长短取决于数据库的大小和活动。

5 对该数据库运行 checkpoint 以刷新已更新的页。

6 运行 dump database。

安排 master 的备份




master 数据库备份用作恢复过程的一部分,以防出现影响 master 数据库的故障。如果没有 master 数据库的当前备份,则可能在需要用户数据库并再次运行它时不得不重建重要的系统表。

虽然可以限制 master 中数据库对象的创建,但 create login、drop login 和 alter login 等命令允许用户在数据库中修改系统表。经常备份 master 数据库以记录这些更改。

在执行影响磁盘、存储、数据库或段的每个命令后,都备份 master 数据库。始终在发出以下任何命令或系统过程后备份 master 数据库:

• disk init、 sp_addumpdevice 或 sp_dropdevice
• 磁盘镜像命令
• 段系统过程 sp_addsegment、sp_dropsegment 或 sp_extendsegment
• create procedure 或 drop procedure
• sp_logdevice
• sp_configure
• create database 或 alter database 

使用bcp导出 master 的系统表




为进一步进行保护,保存包含所有 disk init、create database 和 alter database 命令的脚本,并在每次发出这些命令之一后为sysdatabases、sysusages 和 sysdevices 表生成书面副本。

示例:BCP导出系统表

bcp master..sysdatabases out .sysdatabases.bcp -Usa -Pdbask.cn -Stest -c
bcp master..sysusages out .sysusages.bcp -Usa -Pdbask.cn -Stest -c
bcp master..sysdevices out .sysdevices.bcp -Usa -Pdbask.cn -Stest -c
bcp master..syslogins out .sysloginss.bcp -Usa -Pdbask.cn -Stest -c
bcp master..sysusers out .sysuses.bcp -Usa -Pdbask.cn -Stest -c
bcp master..sysrols out .sysroles.bcp -Usa -Pdbask.cn -Stest -c

数据库全备dump database




语法结构:

dump databae 数据库名 to '路径/备份名' [参数]

详细语法:

dump database database_name
 to [compress::[compression_level::]]stripe_device
 [at backup_server_name]
 [density = density_value,
 blocksize = number_bytes,
 capacity = number_kilobytes,
 dumpvolume = volume_name,
 file = file_name]
 [with shrink_log]
 with verify[= header | full]
 [stripe on [compress::[compression_level::]]stripe_device
 [at backup_server_name]
 [density = density_value,
 blocksize = number_bytes,
 capacity = number_kilobytes,
 dumpvolume = volume_name,
 file = file_name]]
 [[stripe on [compress::[compression_level::]]stripe_device 
[at backup_server_name]
 [density = density_value,
 blocksize = number_bytes,
 capacity = number_kilobytes,
 dumpvolume = volume_name,
 file = file_name]]...]
 [with {
 density = density_value,
 blocksize = number_bytes,
 capacity = number_kilobytes,
 compression = compress_level
 dumpvolume = volume_name,
 file = file_name,
 [dismount | nodismount],
 [nounload | unload],
 passwd = password,
 retaindays = number_days,
 [noinit | init],
 notify = {client | operator_console}
 }] 

主要参数:

- database_name 是您从中复制数据的数据库的名称。可将数据库名称指定为文字、局部变量或存储过程参数。

- compression = compress_level 是 0 到 9 之间的数字、100 或 101。对于一位数的压缩级别,0 表示不进行压缩,而 9 表示最高级别的压缩。压缩级别 100 和 101 提供更加快捷、更加有效的压缩模式,其中 100 提供更加快捷的压缩,而 101 提供程度更高的压缩。如果不指定 compress_level,Adaptive Server 将不会压缩转储。

- with shrink_log 在使用 alter database log off 命令缩减日志中的空间时如果在数据库中创建了空洞,则会使用它。

- stripe on stripe_device 可以使用多达 32 个设备,其中包括在 to stripe_device 子句中命名的设备。Backup Server 将数据库分成几个大致相等的部分,并将每个部分发送到不同的设备。转储是在每个设备上同时进行的,减少了进行转储所需的时间,并且转储过程中需要的卷更改更少。

示例:使用压缩级别 4 创建 userdb 数据库的压缩转储,并保存为名为userdb_full_20240101.dmp 的本地文件:

dump database userdb to "/backup/userdb_full_20240101.dmp" with compression = 4
go

示例:创建 userdb 数据库的压缩转储,使用stripe将备份结果分为4个文件,并保存为名为userdb_full_20240101_[01-04].dmp

dump database userdb to "/backup/userdb_full_20240101_01.dmp" 
stripe on "/backup/userdb_full_20240101_02.dmp"
stripe on "/backup/userdb_full_20240101_03.dmp"
stripe on "/backup/userdb_full_20240101_04.dmp"
with compression = 4
go

数据库增备dump transaction




制作事务日志的副本并删除不活动的部分。

语法结构

dump tran 数据库名 to '路径/备份名' [参数]

示例:userdb 数据库增量备份,并保存为名为userdb_tran_20240101.dmp 的本地文件

 dump tran userdb to "/backup/userdb_tran_20240101.dmp"
go

数据库恢复load databae




语法结构

load database 数据库名 from '路径/备份名'

load tran 数据库名 from '路径/备份名'

示例: 恢复userdb数据库userdb_full_20240101_[01-04].dmp及增备userdb_tran_20240101.dmp 和userdb_tran_20240102.dmp;并online database

load database userdb from "/backup/userdb_full_20240101_01.dmp" 
stripe on "/backup/userdb_full_20240101_02.dmp"
stripe on "/backup/userdb_full_20240101_03.dmp"
stripe on "/backup/userdb_full_20240101_04.dmp"
go
load tran userdb from "/backup/userdb_tran_20240101.dmp"
go
load tran userdb from "/backup/userdb_tran_20240102.dmp"
go
online database userdb                               ----只有在恢复完备份后才可执行
go
sp_dboption userdb,'select',true                     ----设置数据库选项,load完毕后这个需要重新设置
go

数据库备份建议




建议定期备份数据库;一般建议每周或每天一次全备,每天1-n次增量备份

同时建议备份master库

数据库增删设备、增删登录用户后,及时备份master库

· 全备基本语法

dump database 数据库名 to '路径/备份文件名'

· 增备基本语法

dump tran 数据库名 to '路径/备份文件名'

示例:备份master库

dump database master to '/backup/master_20xx0101.dump'
go

示例:增量备份userdb库(如打开日志截断选项,则无法增量备份数据库,请执行全备 dump database userdb to ...)

dump tran userdb to '/backup/user_tran_20xx0101.dump'
go