文章

数据库备份与恢复

数据库备份与恢复

数据库备份与恢复

1. 数据库备份恢复概念

1.1 系统故障类型

  • 系统故障
  • 事务故障
  • 介质故障
  • 灾难

1.2 恢复策略

  • 数据可重载性:可以再次从另一个来源装入数据吗?
  • 数据丢失容忍度:能够承受丢失多少数据?
  • 恢复时间目标 (RTO):能花多少时间来恢复数据库?
  • 存储资源:哪些存储资源可用于存储备份和日志?

1.3 恢复类型

  • 崩溃恢复:系统崩溃后,DB2 重新启动时自动执行回滚。
  • 版本恢复:使用 BACKUP 命令获取的备份来恢复先前的数据库版本。
  • 前滚恢复:结合完全数据库备份和日志文件来扩展版本恢复,要求使用归档日志记录。

DB2 采用先写日志后写磁盘的方式来确保数据一致性。

2. 日志管理

2.1 主日志文件和辅助日志文件

  • 主日志文件:在首次数据库连接或数据库激活时直接分配。
  • 辅助日志文件:在主日志文件用尽时按需动态分配。

相关数据库配置参数

  • LOGPRIMARY:主日志文件数。
  • LOGSECOND:可分配的最大辅助日志文件数(最大 254)。
  • LOGFILSIZ:日志文件的大小(单位:4 KB 页)。

查看日志配置

db2 get db cfg for <database_name>

2.2 无限日志记录

要启用无限活动日志记录,需设置:

  • USEREXITON
  • LOGSECOND-1

2.3 日志类型

  • 活动日志:包含未提交或未外部化(写入磁盘)的事务信息。
  • 联机归档日志:包含已提交且已外部化的事务信息,与活动日志在同一目录。
  • 脱机归档日志:已从活动日志目录移动到其他位置的归档日志。

2.4 日志记录类型

循环日志记录 (Circular Logging)

  • 默认方式,循环重用日志文件。
  • 仅支持崩溃恢复版本恢复
  • 当日志仅包含已提交且已外部化的事务信息时,才可被重用。

归档日志记录 (Archival Logging)

  • 保留所有日志文件,不进行覆盖。
  • 支持所有恢复类型:崩溃恢复版本恢复前滚恢复
  • 启用方式(满足其一即可):
    • LOGRETAIN 设置为 ON
    • USEREXIT 设置为 ON
-- 启用 LOGRETAIN
db2 update db cfg for <database_name> using LOGRETAIN ON

-- 启用 USEREXIT
db2 update db cfg for <database_name> using USEREXIT ON

3. 数据库和表空间备份

执行备份需要 SYSADMSYSCTRLSYSMAINT 权限。

3.1 数据库备份

数据库备份是数据库的完整副本,包含数据、表空间、配置、日志控制文件和恢复历史文件。

完全脱机备份示例

BACKUP DATABASE sample
TO /db2backup/dir1, /db2backup/dir2
WITH 4 BUFFERS
BUFFER 4096
PARALLELISM 2;
  • TO: 指定备份存储位置。
  • WITH ... BUFFERS: 指定内存缓冲区数量以提升性能。
  • BUFFER: 指定每个缓冲区的大小。
  • PARALLELISM: 指定并行处理的进程/线程数。

完全联机备份示例

联机备份允许在备份期间访问数据库,但要求启用归档日志记录

BACKUP DATABASE sample
ONLINE
TO /dev/rdir1, /dev/rdir2;

3.2 表空间备份

只备份特定的表空间,适用于只有部分表空间有大量更改的场景。此备份方式只能在归档日志记录环境中使用。

BACKUP DATABASE sample
TABLESPACE (syscatspace, userspace1, userspace2)
ONLINE
TO /db2tbsp/backup1, /db2tbsp/backup2;

3.3 增量备份

  • 增量 (Incremental):备份自上次完全数据库备份以来所有已更改的数据。
  • 增量差异 (Delta):备份自上次任何类型(完全、增量、差异)的成功备份以来已更改的数据。

要执行增量备份,数据库配置参数 TRACKMOD 必须设置为 YES

3.4 备份文件命名约定

数据库别名.备份类型.实例名.节点号.目录节点号.时间戳.序列号

  • 备份类型: 0 (完全), 3 (表空间), 4 (LOAD副本)

4. 数据库和表空间恢复

4.1 数据库恢复

恢复示例

RESTORE DATABASE sample
FROM C:/DBBACKUP
TAKEN AT 20030314131259
WITHOUT ROLLING FORWARD
WITHOUT PROMPTING;
  • FROM: 指定备份文件的位置。
  • TAKEN AT: 指定要恢复的备份映像的时间戳。
  • WITHOUT ROLLING FORWARD: 恢复后不将数据库置于前滚暂挂状态。

4.2 表空间恢复

恢复表空间后,它将始终处于前滚暂挂状态,必须至少前滚到最小时间点 (Point in Time, PIT) 才能使其可用。

恢复示例

RESTORE DATABASE sample
TABLESPACE (mytblspace1)
ONLINE
FROM /db2tbsp/backup1, /db2tbsp/backup2;

4.3 重定向恢复

当备份时的容器路径不再存在或需要将数据库恢复到不同配置的环境时,使用重定向恢复。

步骤

  1. 启动重定向恢复
    RESTORE DATABASE DB2CERT FROM C:/DBBACKUP INTO NEWDB REDIRECT WITHOUT ROLLING FORWARD;
    
  2. 查看表空间信息
    LIST TABLESPACES SHOW DETAIL;
    
  3. 为每个表空间设置新容器
    SET TABLESPACE CONTAINERS FOR 0 USING (FILE "d:/newdb/cat0.dat" 5000);
    SET TABLESPACE CONTAINERS FOR 1 USING (PATH "d:/newdb2");
    
  4. 继续恢复过程
    RESTORE DATABASE DB2CERT CONTINUE;
    

5. 数据库和表空间前滚

ROLLFORWARD 命令用于应用日志文件中的事务,以将数据库或表空间恢复到特定时间点。

5.1 数据库前滚

前滚示例

-- 前滚到日志末尾
ROLLFORWARD DATABASE sample TO END OF LOGS AND COMPLETE;

-- 前滚到指定时间点 (UTC)
ROLLFORWARD DATABASE sample TO <timestamp> AND COMPLETE;

-- 前滚到指定时间点 (本地时间)
ROLLFORWARD DATABASE sample TO <timestamp> USING LOCAL TIME AND COMPLETE;

5.2 表空间前滚

表空间前滚通常可以联机或脱机执行,但系统目录表空间 (SYSCATSPACE) 只能脱机前滚。

前滚示例

ROLLFORWARD DATABASE sample
TO END OF LOGS AND COMPLETE
TABLESPACE (userspace1) ONLINE;

查询前滚状态

ROLLFORWARD DATABASE sample QUERY STATUS USING LOCAL TIME;

6. 索引重建

数据库配置参数 INDEXREC 决定何时重建无效索引。

  • SYSTEM: 遵循数据库管理器配置。
  • ACCESS: 在首次访问索引时重建。
  • RESTART: 在数据库重新启动期间重建。

7. 管理与工具

生成 DDL

使用 db2look 工具可以生成数据库对象的 DDL。

-- 生成表结构 DDL
db2look -d SAMPLE -t MY_EMPLOYEE -a -e -l -x -c

-- 包括统计信息的 DDL
db2look -d SAMPLE -t MY_EMPLOYEE -a -e -l -x -m -r -c

8. 空间需求估算

用户表数据空间

  • 每页记录数(4028 / (平均行大小 + 10))
  • 总页数(记录总数 / 每页记录数) * 1.1

索引空间

  • 估算大小(平均索引键大小 + 9) * 行数 * 2
  • 创建时临时空间(平均索引键大小 + 9) * 行数 * 3.2

日志文件空间

(logprimary + logsecond) * (logfilesiz + 2) * 4096

9. 分区数据库

验证分区

1
SELECT DISTINCT DBPARTITIONNUM(empno) FROM employee;

分区键

  • 未指定时,默认为主键的第一列或第一个非长类型列。
  • 分区键不能更改,且任何唯一键或主键必须包含所有分区键列。

表并置

为实现表并置(collocation),经常一起连接的表应使用数据类型兼容的分区键。

10. 隔离级别

隔离级别决定了数据在被访问时如何被锁定或与其他进程隔离。

  • Repeatable Read (RR)
  • Read Stability (RS)
  • Cursor Stability (CS)
  • Uncommitted Read (UR)

隔离级别在预编译、绑定或作为连接/语句选项时指定。

在上一章中,我们简要地讨论了 ROLLFORWARD 命令。在本章中,我们将更详细地讨论它。ROLLFORWARD 命令允许恢复到某一时间点;

这意味着该命令将让您遍历 DB2 日志,并重做或撤销记录在日志中的操作直到某个特定的时间点。虽然可以将数据库或表空间前滚到最小

PIT 之后的任何时间点,但不能保证您选择前滚到的结束时间将使所有数据保持一致。

我们将不在本教程中讨论 QUIESCE 命令。然而,值得提一下的是:可以在常规数据库操作期间使用该命令来设置一致性点。通过设置

这些一致性点,您可以始终执行至其中任何一点的时间点恢复,并保证数据同步。

一致性点和许多其它信息一起被记录在 DB2 历史记录文件中,可以使用 LIST HISTORY 命令来查看该文件。

在前滚处理期间,DB2 将:

在当前日志路径中查找必需的日志文件。

如果找到该日志,重新从日志文件应用事务。

如果在当前路径中找不到该日志文件,并且使用了 OVERFLOWLOGPATH 选项,那么 DB2 将在该选项指定的路径中搜索并且将使用该位置中的

日志。

如果在当前路径中找不到该日志文件并且没有使用 OVERFLOWLOGPATH 选项,则调用用户出口来检索归档路径中的日志文件。

仅当前滚完全数据库恢复并且启用了用户出口时,才会调用用户出口来检索日志文件。

一旦日志在当前日志路径或 OVERFLOWLOGPATH 中,就将重新应用事务。

执行 ROLLFORWARD 命令需要 SYSADM、SYSCTRL 或 SYSMAINT 权限。

下面是 ROLLFORWARD 命令的语法:

ROLLFORWARD DATABASE database-alias [USER username [USING password]]

[TO {isotime [ON ALL DBPARTITIONNUMS] [USING LOCAL TIME]END OF LOGS
[On-DbPartitionNum-Clause]}] [AND {COMPLETESTOP}]
{COMPLETESTOPCANCELQUERY STATUS [USING LOCAL TIME]}
[On-DbPartitionNum-Clause] [TABLESPACE ONLINETABLESPACE (tblspace-name

[ {,tblspace-name} … ]) [ONLINE]] [OVERFLOW LOG PATH (log-directory

[{,log-directory ON DBPARTITIONNUM db-partition-number} … ])] [NORETRIEVE]

[RECOVER DROPPED TABLE dropped-table-id TO export-directory]

On-DbPartitionNum-Clause:

ON {{DBPARTITIONNUMDBPARTITIONNUMS} (db-partition-number
[TO db-partition-number] , … )ALL DBPARTITIONNUMS [EXCEPT
{DBPARTITIONNUMDBPARTITIONNUMS} (db-partition-number

[TO db-partition-number] , …)]}

让我们研究一个示例。要执行样本数据库的前滚,可以使用下列任意一条语句:

  1. ROLLFORWARD DATABASE sample TO END OF LOGS AND COMPLETE
  2. ROLLFORWARD DATABASE sample TO timestamp AND COMPLETE
  3. ROLLFORWARD DATABASE sample TO timestamp USING LOCAL TIME AND COMPLETE

让我们仔细地研究每一条语句:

在该示例中,我们将前滚到日志的结尾,这意味着将遍历所有归档和活动日志。最终它将完成前滚并通过回滚任何未提交的事务来除去前滚暂挂状态。

对于该示例,DB2 将前滚到指定的时间点。使用的时间戳记形式必须是 CUT(全球标准时间,Coordinated Universal Time),这可以通

过从当前时区减去本地时间来计算。

该示例类似于上一个示例,但可以用本地时间表示时间戳记。

请注意,语法中没有关键字 OFFLINE,因为这是缺省方式。事实上,对于 ROLLFORWARD 命令,这是数据库允许的唯一方式。

4.2 表空间前滚

表空间前滚通常可以联机或脱机。但系统目录表空间(SYSCATSPACE)是例外,它只能进行脱机前滚。

下面是一个表空间前滚示例:

ROLLFORWARD DATABASE sample

TO END OF LOGS AND COMPLETE

TABLESPACE ( userspace1 ) ONLINE

上面示例中的选项已经在数据库前滚一章中说明过了。这里唯一的新选项是 TABLESPACE,它指定要前滚的表空间。

表空间前滚考虑事项

如果启用注册表变量 DB2_COLLECT_TS_REC_INFO,则只处理恢复表空间所需的日志文件;ROLLFORWARD 命令将跳过不需要的日志文件,这可以加快恢复时间。

ROLLFORWARD 命令的 QUERY STATUS 选项可用于列出 DB2 已经前滚的日志文件、下一个需要的归档日志文件以及自前滚处理开始以来最后一次提交的事务的时间戳记。例如:

ROLLFORWARD DATABASE sample QUERY STATUS USING LOCAL TIME

在表空间时间点前滚操作完成后,表空间处于备份暂挂状态。必须对表空间或数据库进行备份,因为在表空间恢复到的时间点和当前时间之间对它所做的所有更新都已经丢失。

##索引的重新创建

#重建索引

如果由于一些硬件或操作系统原因而使数据库崩溃,那么在数据库重新启动阶段一些索引可能被标记为无效。配置参数 INDEXREC 确定 DB2 何时将试图重建无效索引。

INDEXREC 在数据库管理器和数据库配置文件中都进行了定义。该参数有三个可能的设置:

SYSTEM:只能在数据库配置文件中指定该值。当将 INDEXREC 设置为该值时,DB2 将查找在数据库管理器配置文件中指定的 INDEXREC 设置,并使用该值。

ACCESS:这意味着在第一次访问索引时重建无效索引。

RESTART:这意味着在数据库重新启动期间重建无效索引。

###管理服务器

get admin cfg

update admin cfg using

备份表空间

BACKUP DATABASE SAMPLE TABLESPACE ( USERSPACE1 ) ONLINE TO “d:/db2/” WITH 1 BUFFERS BUFFER 1024 PARALLELISM 1 WITHOUT PROMPTING;

生成表的DDL

db2look -d SAMPLE -t MY_EMPLOYEE -a -e -l -x -c ;

包括表的统计信息的DDL

db2look -d SAMPLE -t MY_EMPLOYEE -a -e -l -x -m -r -c ;

svmon

5.1 maintrcie 4

db2 fixpak 2

数据库空间需求

系统目录表的空间需求 3.5MB

用户表数据的空间需求

每页面255行

4KB页面 68字节用于管理开销,4028用于数据,行长度不能超过4005字节,最多500列。

8,16,32KB 页面 8101,16293,32677 1012列

```plain text 估计大小公式4KB:

1
2
3
  (4028/(AVERAGE ROW SIZE + 10)) = RECORDS_PER_PAGE

  (NUMBER_OF_RECORDS/RECORDS_PER_PAGE)*1.1 = NUMBER_OF_PAGES ```

长型字段数据的空间需求

存储在单独的表对象中。数据存储在大小为32KB的区域中。

大对象数据的空间需求

#索引的空间的需求

(平均索引键大小+9)×行数×2

创建索引的临时空间需求

```plain text (平均索引键大小+9)×行数×3.2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
对每个叶子页的平均键数的粗略估计是

#日志文件的空间需求

(logprimary + logsecond)*(logfilesiz+2)*4096

如果以对数据库启用了无限记录(logsecond 设置为-1),则必须启用userexit配置参数。

#临时空间需求

##分区数据库验证

select distinct dbpartitionnum(empno) from employee;

#分区键

未指定则使用主键的第一列,无主键则使用第一个非长类型列。

选择能否使数据分布均匀及经常使用的列,可以用列的组合但不能超过16列,列越少,性能越好。

分区键不能更改,任何唯一键或主键必须包含分区键列

#表并置

需要经常进行关联的表在指定分区键时,每个分区键中对应列的数据类型必须是分区兼容的,并称为表并置

具有相同值但有不同类型的两个变量会安相同的分区算法映射至同一个分区号。

```plain text
    如:INTEGER,SMALLINT,BIGINT

REAL,FLOAT

CHAR,VARCHAR

#隔离级别

隔离级确定了在数据被访问时,如何锁定数据或将数据与其它进程隔离。您可以在应用程序预编译或在

静态 SQL 程序中绑定到数据库时指定隔离级,或者也可以将它指定为连接或语句选项。

选择的隔离级可同时影响 DB2 选择的锁定策略和 S 行锁定可以由应用程序持有的时间。

隔离级只应用于被读取的行。对于更改的行,应用程序需要获取一个 X 或 W 锁。无论应用程序的隔离级是什么,

X 或 W 锁在回滚或提交之前不被释放。

本文由作者按照 CC BY 4.0 进行授权