51Testing软件测试论坛

标题: Sybase IQ数据库恢复技术研究与实践 [打印本页]

作者: lsekfe    时间: 2020-12-28 10:11
标题: Sybase IQ数据库恢复技术研究与实践
摘要:
  Sybase IQ列存储数据库由于查询速度快、数据压缩比高、数据加载快而广泛应用于OLAP系统中,我行一些重要系统及其历史库目前还部署在Sybase IQ数据库上。近几年随着Oracle数据库成为我行主流数据库,其他数据库(如Sybase IQ、Sybase ASE)正逐渐迁移至Oracle数据库中。本文以日常工作中一个具体案例为背景,详细介绍Sybase IQ数据库的整库异机恢复方法,通过大量测试得出Sybase IQ数据库不同版本、不同操作系统间数据迁移的可行性,希望对开发及数据服务人员有所借鉴。
  关键字:Sybase IQ、DBSPACE、DBFILE、生产数据备份、数据恢复环境/脱敏环境
  1、基本概念
  1.1 OLAP/OLTP系统
  联机分析处理OLAP(On-Line Analytical Processing)是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,提供直观易懂的查询结果。
  联机事务处理OLTP(On-Line Transaction Processing)是传统的关系型数据库的主要应用,主要的特点是大量的短暂在线事务(插入、更新、删除)。
  1.2 DBSPACE
  数据的逻辑容器,在Sybase IQ 15中一般由一个或多个dbfile组成(功能与Oracle数据库中表空间类似),Sybase IQ 15数据库包括多个逻辑存储结构,分别是:
  1. Catalog Store:存储数据库的元数据(metadata),功能类似于system、sysaux表空间。
  2. Main Store:用于存储用户数据,功能类似于users表空间。
  3. Temp Store:存储装载和查询操作执行期间生成的临时数据和用户定义的临时表,功能类似于temp表空间。
  注:从Sybase IQ 15开始,不建议使用Main Store存放用户的业务数据,建议用户建立单独的dbspace存放业务数据。
  1.3 DBFILE
  存放数据的物理存储结构(功能与Oracle数据库中的datafile类似),在Sybase IQ 15中一个或多个dbfile组成一个dbspace,一个dbfile一般对应一个数据文件或裸设备。
  1.4 裸设备
  也叫裸分区(原始分区),是一种没有经过格式化,不被Unix/Linux通过文件系统来读取的特殊字符设备。裸设备可以绑定一个分区,也可以绑定一个磁盘。裸设备在操作系统的文件属性为c开头。
  2、背景介绍
  2019年初,受理了某平台基础架构升级-AIX小型机迁移项目数据申请,此次数据申请包含两个Sybase IQ数据,其中一个数据库部署在小型机AIX系统上(版本Sybase IQ 15.2),另一个部署在Linux上(版本Sybase IQ 15.4),生产数据以全库备份方法提供,需要搭建数据脱敏环境并将生产数据备份恢复至脱敏环境中,脱敏后交付测试数据给项目组进行项目迁移的具体测试工作。
  3、Sybase IQ数据库恢复实践
  3.1 准备工作
  3.1.1 生产系统数据库结构与备份脚本查看
  由于异机全库恢复需要对源生产库结构有一定的了解,首先查询得到生产系统IQ数据库的相关信息(由于列数较多,在此只列出关键字段),具体信息如下:
  1> sp_iqfile
  2> go
  DBSpaceName  DBFileName   Path  SegmentType  RWMode   DBFileSize
  IQ_SYSTEM_MAIN  IQ_SYSTEM_MAIN  /dev/raw/raw2  MAIN    RW     40G
  RMSMAIN01       RMSMAIN01_file01   /dev/raw/raw1  MAIN     RW    100G
  RMSMAIN01       RMSMAIN01_file02   /dev/raw/raw4  MAIN     RW    200G
  RMSMAIN01       RMSMAIN01_file03   /dev/raw/raw5  MAIN     RW    200G
  RMSMAIN01       RMSMAIN01_file04   /dev/raw/raw6  MAIN     RW    200G
  RMSMAIN01       RMSMAIN01_file05   /dev/raw/raw7  MAIN     RW    200G
  RMSMAIN01       RMSMAIN01_file06 / dev/raw/raw8  MAIN      RW      200G
  IQ_SYSTEM_TEMP  IQ_SYSTEM_TEMP  /dev/raw/raw3 TEMPORARY RW    40g
  IQ_SYSTEM_TEMP  IQ_SYSTEM_TEMP02 /dev/raw/raw9  TEMPORARY  RW  60g
  从查询信息可以看出,该数据库共包含三个dbspace,分别为IQ_SYSTEM_MAIN、RMSMAIN01和IQ_SYSTEM_TEMP,其中RMSMAIN01用于存放该系统的业务数据,该dbspace包含6个dbfile,每一个dbfile对应一个裸设备文件,业务数据存放在具体的裸设备中;IQ_SYSTEM_TEMP包含两个dbfile文件,用于存放临时数据;IQ_SYSTEM_MAIN包括一个dbfile,用于存放用户和业务数据,但之前提到IQ15后不在建议在此dbspace中存放业务数据。
  查看生产系统/etc/raw文件,内容如下:‘
  raw2:vgsybiq/lviqsysmain01
  raw3:vgsybiq/lviqsystemp01
  raw9:vgsybiq/lviqsystemp02
  raw1:vgsybiq/lviqrmsmain01
  raw4:sdh
  raw5:sdi
  raw6:sdj
  raw7:sdk
  raw8:sdl
  可以看出,一些裸设备与某一个逻辑卷关联,另外一部分与具体物理磁盘关联。
  生产系统数据备份脚本为:
  (dba)>backup database to '/data/backup/fullbak',备份完成后将在/data/backup/目录下生成fullbak开头的备份文件。
  3.1.2 脱敏环境搭建
  Sybase IQ数据库恢复与Sybase ASE略有不同,不需要像Sybase ASE数据库一样搭建具体的数据库,只需安装数据库软件并配置好环境变量即可,本文将IQ软件安装在/sybiq目录下,并创建sybiq操作系统用户进行软件的安装,具体安装过程在此不在详细说明。
  3.1.3 脱敏环境存储准备
  IQ数据库全库异机恢复一般可以使用两种方法进行数据恢复:
  1.数据的恢复路径、名称与生产一致;
  2.数据的恢复路径、名称与生产系统不一致。
  对于恢复路径一致的情况,首先按照3.1.1章节中查到的信息创建裸设备,注意裸设备的名称要与生产一致,大小要大于生产系统对应裸设备,建立好裸设备后注意裸设备的权限,应确保sybiq用户对裸设备可读可写。
  对于路径不一致的情况,我们尝试将RMSMAIN01这个dbspace的数据恢复到文件系统/data/backup中,文件系统的大小大于3.1.1章节中查到的RMSMAIN01所包含的所有dbfile之和,并为其他两个dbspace(IQ_SYSTEM_MAIN、IQ_SYSTEM_TEMP)建立名称和大小一致的裸设备,另外确保sybiq用户对相应目录和裸设备具有可读写权限;
  说明:为了便于本文说明,将文件备份统一存放在/data/backup目录下,数据恢复的文件系统目录为/data/sybiq目录。
  3.2 恢复实践
  3.2.1生产系统与恢复环境路径一致
  首先将生产系统备份传输至恢复环境/data/backup目录下,并确保sybiq用户对备份文件有可读写权限。之后在恢复环境中使用sybiq用户启动utility server,该数据库为IQ数据库自带数据库,不需额外创建。
  start_iq -n myserver //启动命令
  之后使用dba(密码默认为sql)用户身份登录到utility_db
  dbisql -c "uid=dba;pwd=sql;eng=myserver;dbn=utility_db" -nogui
  登陆后执行具体恢复工作
  (dba)>restore database '/data/sybiq/rmsiqdb.db' from '/data/backup/fullbak'
  其中rmsiqdb.db为前面章节提到的IQ数据库中存放元数据的dbspace,名称和路径可以按照需求自行修改,from关键字后的目录为生产备份存放的目录,fullbak为备份文件的名称,该名称应与备份时名称保持一致。
  可通过/sybiq/IQ-15_4/logfiles中类似于“myserver.0002.stderr”格式的文件查看恢复进度,恢复完成后通过stop_iq命令关闭utility_db。
  之后进入/data/sybiq目录下执行dblog -r -t rmsiqdb.log rmsiqdb.db,最后将生产库中rmsiqdb.cfg文件进行修改后传输至/data/sybiq目录下后执行:
  start_iq @rmsiqdb.cfg rmsiqdb.db启动数据库,至此,IQ数据库的恢复完成。
  下面列出rmsiqdb.cfg文件中常用参数及其解释:
  -n  EHR_IQ_SERV                                      SERVER名
  -x  tcpip{port=5300}                                 通讯协议(端口)
  -cl  1024m                              元数据库的最小cache的大小
  -ch  2048m                              元数据库的最大cache的大小
  -gc  20                                      检查点时间间隔(分钟)
  -gd  dba                           设置启动和停止数据库所需的权限
  -gk  dba                       设置启动和停止数据库服务所需的权限
  -gl  all                              设置装载、卸载数据所需的权限
  -gm  60                                               并发用户数
  -ti  4400                                   客户端自动中断时间 min
  -tl  300                                      网络超时时间间隔(秒)
  -gp  4096                           >=page size,元数据表空间页大小
  -iqmc 4096                                  数据cache,参考值:4G
  -iqtc 8192                                         临时高速缓存大小
  -iqmsgsz 512                            iq消息日志文件大小
  -iqmsgnum 1                                      文件个数
  -iqnumbercpus 8                                   CPU核心数
  注:使用start_iq -?可以查看各参数意义和默认值。
  3.2.2 生产库与恢复环境路径不一致情况
  从3.2.1章节可以看出,对于生产库与恢复环境恢复路径一致的情况,IQ数据库的恢复较为简单,只需在恢复环境中建立与生产环境完全一致的裸设备或文件系统即可,但在具体工作中如果遇到路径不一致的情况,恢复工作如何进行呢?本节将对这种情况进行介绍。
  前面的步骤和路径一致时完全一致,也需要启动并连接utility_db,之后开始数据恢复:
  start_iq -n myserver
  (dba)>dbisql -c "uid=dba;pwd=sql;eng=myserver;dbn=utility_db" -nogui
  之后开始恢复
  restore database '/data/sybiq/rmsiqdb.db' from '/data/backup/fullbak’' rename RMSMAIN01_file01 to '/data/sybiq/RMSMAIN01_file01.iq' rename RMSMAIN01_file02 to '/data/sybiq/RMSMAIN01_file02.iq' rename RMSMAIN01_file03 to '/data/sybiq/RMSMAIN01_file03.iq' rename RMSMAIN01_file04 to '/data/sybiq/RMSMAIN01_file04.iq' rename RMSMAIN01_file05 to '/data/sybiq/RMSMAIN01_file05.iq' rename RMSMAIN01_file06     to      '/data/sybiq/RMSMAIN01_file06.iq'
  自此,RMSMAIN01对应的dbfile都将恢复至/data/sybiq/目录下,其他两个dbspace对应的dbfile将恢复至相应的裸设备中,之后使用命令启动数据库即可:
  start_iq @rmsiqdb.cfg rmsiqdb.db
  如果在启动后发现RMSMAIN01对应的dbfile的状态为offline,登陆后可使用sp_iqfile查看Path列是否依然还是裸设备而非修改后的文件系统,如果还是裸设备说明虽然RMSMAIN01的dbfile已经恢复至/data/sybiq/目录下,但数据库字典中记录的dbfile依然是生产库的裸设备信息,由于不一致造成dbfile状态为offline。对此需要手动修改为一致,具体修改方法为:
  ----------修改RMSMAIN01的dbfile路径与名称
  ALTER DBSPACE RMSMAIN01 READONLY
  ALTER DBSPACE RMSMAIN01 OFFLINE
  ALTER DBSPACE RMSMAIN01 ALTER FILE RMSMAIN01_file01 RENAME PATH '/data/sybiq/RMSMAIN01_file01.iq'
  ALTER DBSPACE RMSMAIN01 ALTER FILE RMSMAIN01_file02 RENAME PATH '/data/sybiq/RMSMAIN01_file02.iq'
  ALTER DBSPACE RMSMAIN01 ALTER FILE RMSMAIN01_file03 RENAME PATH '/data/sybiq/RMSMAIN01_file03.iq'
  ALTER DBSPACE RMSMAIN01 ALTER FILE RMSMAIN01_file04 RENAME PATH '/data/sybiq/RMSMAIN01_file04.iq'
  ALTER DBSPACE RMSMAIN01 ALTER FILE RMSMAIN01_file05 RENAME PATH '/data/sybiq/RMSMAIN01_file05.iq'
  ALTER DBSPACE RMSMAIN01 ALTER FILE RMSMAIN01_file06 RENAME PATH '/data/sybiq/RMSMAIN01_file06.iq'
  ALTER DBSPACE RMSMAIN01 ONLINE
  ALTER DBSPACE RMSMAIN01 READWRITE
  修改后发现所有dbfile的状态都变为online且为可读可写,之后启动数据库即可。从上面的恢复步骤可以看出,对于生产系统与恢复环境路径不一致的情况,需要显示指定每一个dbfile并将其路径和名称通过rename to关键字进行修改。修改后如果相应dbfile为offline还需修改数据库中记录的dbfile的路径和名称,修改完成后dbfile的状态才能为online且可读可写。
  3.2.3 跨版本数据恢复
  再来研究IQ数据库跨版本恢复的问题,首先对Sybase IQ 15.4 for Linux到 Sybase IQ 15.2 for Linux进行测试。
  先登录到源库Sybase IQ 15.4进行全库数据备份,备份命令为:
  (DBA)> backup database to '/data/backup/fullbak'
  之后将备份文件拷贝至目标数据库(版本为Sybase IQ 15.2)后进行还原
  (DBA)> restore database '/data/sybiq/rmsiqsys.db' from '/data/backup/fullbak';
  Could not execute statement.
  Backup file format is invalid
  SQLCODE=-716, ODBC 3 State="HY000"
  Line 1, column 1
  restore database '/data/sybiq/rmsiqsys.db' from '/data/backup/fullbak'
  Press ENTER to continue...
  由此可以发现,当IQ数据库源库的版本高于目标库时,数据恢复失败。那么目标库的版本高于源库的版本呢?
  再登录到源库Sybase IQ 15.2进行全库数据备份,备份命令为:
  (DBA)> backup database to '/data/backup/fullbak'
  之后将备份文件拷贝至目标数据库(版本为Sybase IQ 15.4)后进行还原
  (DBA)> restore database '/data/sybiq/rmsiqsys.db' from '/data/backup/fullbak';
  可以发现恢复可以正常完成。
  3.2.4 跨操作系统数据恢复
  那么跨操作系统的情况呢,使用源库为AIX小型机(IQ 15.2),目标库为 Linux(IQ15.2)来进行试验:
  (dba)> restore database '/data/sybiq/rmsiqsys.db' from '/data/backup/fullbak';
  Could not execute statement.
  Error during backup/restore: error reading from /data/backup/fullbak ()
  SQLCODE=-697, ODBC 3 State="HY000"
  Line 1, column 1
  restore database '/data/sybiq/rmsiqsys.db' from '/data/backup/fullbak';
  Press ENTER to continue...
  反过来(源库为Linux for IQ15.2,目标库为AIX for IQ 15.2)进行数据恢复依然失败:
  (dba)> restore database '/data/sybiq/rmsiqsys.db' from '/data/backup/fullbak';
  Could not execute statement.
  Error during backup/restore: error reading from /data/backup/fullbak ()
  SQLCODE=-697, ODBC 3 State="HY000"
  Line 1, column 1
  restore database '/data/sybiq/rmsiqsys.db' from '/data/backup/fullbak';
  Press ENTER to continue...
  可以发现,即使数据库版本一致,跨操作系统(AIX到 Linux)异机恢复都不成功,针对跨操作系统的数据迁移,目前一般采用应用级数据迁移方法(bcp导出)进行,应用级数据迁移一般可以屏蔽掉大小字符操作系统间的不一致情况。
  3.2.5结果汇总
  通过上面的测试,总结出以下结论:
表格 1  Sybase IQ跨版本、跨操作系统异机恢复汇总
[attach]131628[/attach]
 4 总结
  本文以测试数据服务中一个具体数据申请为背景阐述了Sybase IQ数据库整库恢复的技术细节,研究如何在生产系统与恢复环境路径一致、不一致等情况进行数据恢复;另外,本文还通过具体测试得出Sybase IQ数据库在跨版本、跨操作系统等情况下全库恢复的可行性。虽然IQ数据库相对小众,但由于列存储快速查询等特点,目前一些系统的历史库部署在IQ数据库中。本文总结出的技术实践无论对数据迁移人员还是数据服务人员都是一个很好的参考和借鉴。







欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2