祝愿大家身体健康!

 站点注册  找回密码
 站点注册

QQ登录

只需一步,快速开始

查看: 7319|回复: 0

dbunload问题的修复

[复制链接]

dbunload问题的修复

[复制链接]
ehxz

主题

0

回帖

56万

积分

管理员

积分
567753
贡献
在线时间
小时
2013-2-22 02:32:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?站点注册

×

One type of database corruption that is reported to Technical Support is typically associated with Assertion Error 50213, "Page number on page does not match page requested". When running on an ASA 6 or 7, the assertion will likely be 200601, "Page for requested record not a table page or record not present on page." Most frequently, however, said database was created on version 5.x and became corrupted before upgrading the software. Occasionally other assertions are reported, depending on the operation that first fails.

Our Product Quality department has stated that they would prefer to receive all databases in-house that become corrupted on version of the software that is currently being developed (as of this writing, SSA 5.5.05, ASA 6.0.4, ASA 7.0.1) in order to investigate the causes and frequency of database corruption. In some cases, however, the procedure described below can be more expedient. Furthermore, if the you are running on software that is no longer being updated (typically the maintenance level currently being sold plus one level earlier), the usefulness of such information is limited.

In all cases of database corruption, the preferred resolution is to find a valid backup, and apply all of the log files since the time of the backup.

This type of corruption is particularly bothersome, however, because it only manifests itself when a particular database page is accessed. If the data on that page is rarely used, the corruption may well exist on many or all of the backups the customer has on hand.

It may be possible to recover the database with the following procedure, although it is likely that some data will be lost. It is up to the customer to determine the validity and completeness of the data in the recovered database.

You will want to use the dbunload command; therefore it is prudent to note the following dbunload switches:

(at the command prompt type: dbunload /? )

Usage: dbunload [switches] <directory> [table-name-list]

Switches (use specified lower-case letter, as shown):



      -c "keyword=value; ..."
      supply database connection parameters
      -d unload data only
      -e no data output for listed tables
      -g <user> specify user name as replacement for dbo
      -ii internal unload, internal reload (default)
      -ix internal unload, external reload
      -j <count> iteration count for view creation statements
      -n no data - schema definition only
      -o <file> log output messages to file
      -p <char> escape character (default "\")
      -q quiet: do not print messages or show windows
      -r <file> specify name of generated reload ISQL
      command file (default "reload.sql")
      -u unordered data
      -v verbose messages
      -xi external unload, internal reload
      -xx external unload, external reload
      -y overwrite command file without confirmation
      NOTE: <directory> must be specified as a path meaningful to
      the engine (or server) unless an external unload is used.
Adaptive Server Anywhere 6 and 7 include additional switches, notably -an and -ac, which can be used to roll the entire recovery process into a single command line. However, when using these switches, if the reload fails, the whole recovery process needs to be started from scratch. For this reason, we will use a manual, three-step process that leaves data and command files even in the event of a partial failure.

Create a working directory (eg c:\working) and an unload directory (eg c:\unload). Placing these directories off the root will save wear and tear on the fingers. Copy the database and log files to the working directory. Open a command prompt in the working directory. Run the following command line. (In this example we are using the asademo.db which comes with ASA6)



      dbunload -c "uid=dba;pwd=sql;dbf=c:\working\asademo.db" -u c:\unload


The output will resemble:



      Unloading "DBA"."sales_order" into c:\unload\192.dat (relative to server)
      Unloading "DBA"."sales_order_items" into c:\unload\193.dat (relative to server)
      Unloading "DBA"."contact" into c:\unload\194.dat (relative to server)
      Unloading "DBA"."customer" into c:\unload\195.dat (relative to server)
      Unloading "DBA"."fin_code" into c:\unload\196.dat (relative to server)
      Unloading "DBA"."fin_data" into c:\unload\197.dat (relative to server)
      Unloading "DBA"."product" into c:\unload\198.dat (relative to server)
      Unloading "DBA"."department" into c:\unload\199.dat (relative to server)
      Unloading "DBA"."employee" into c:\unload\200.dat (relative to server)


In a technical support case, we would see an assertion error message in the above example at this point. Assume table "customer" gave an Assertion Error.

Type the following:



      dbunload -c "uid=dba;pwd=sql;dbf=c:\working\asademo.db" -u c:\unload -e dba.customer


The output will resemble:



      Unloading "DBA"."sales_order" into c:\unload\192.dat (relative to server)
      Unloading "DBA"."sales_order_items" into c:\unload\193.dat (relative to server)
      Unloading "DBA"."contact" into c:\unload\194.dat (relative to server)
      Unloading "DBA"."fin_code" into c:\unload\196.dat (relative to server)
      Unloading "DBA"."fin_data" into c:\unload\197.dat (relative to server)
      Unloading "DBA"."product" into c:\unload\198.dat (relative to server)
      Unloading "DBA"."department" into c:\unload\199.dat (relative to server)
      Unloading "DBA"."employee" into c:\unload\200.dat (relative to server)


This will either complete successfully or yield another corrupt table. Rerun the process with a comma-separated list of tables to exclude until the unload completes successfully.

We will now have a series of *.DAT files with the data we need, and a file called reload.sql with the schema for the database, except for the corrupt tables. We need a complete schema for the database. Type the following in order to create RELOAD1.SQL:



      dbunload" -c "uid=dba;pwd=sql;dbf=c:\working\asademo.db" -n -r RELOAD1.SQL


With your favourite text editor (i.e. notepad) open RELOAD.SQL and RELOAD1.SQL and search for RELOAD DATA. Copy the entire contents of this section from reload.sql to the same section of RELOAD1.SQL.

This section will contain LOAD TABLE paragraphs. I.e:



      LOAD TABLE "DBA"."CONTACT"
      FROM 'c:\\unload\\430.dat'
      FORMAT 'ASCII'
      QUOTES ON ESCAPES ON STRIP OFF
      CHECK CONSTRAINTS OFF
      go


The details will vary slightly depending on the version of the engine doing the unload. Duplicate one of these paragraphs, once for each table that has been corrupted. Replace the table name ("DBA"."CONTACT") with the name of the corrupted table ("DBA"."CUSTOMER"). Replace the DAT file with a unique filename in the same directory ('c:\\unload\\customer.dat')



      LOAD TABLE "DBA"."CUSTOMER"
      FROM 'c:\\unload\\customer.dat'
      FORMAT 'ASCII'
      QUOTES ON ESCAPES ON STRIP OFF
      CHECK CONSTRAINTS OFF
      go


Save the RELOAD1.SQL file.

We now need to salvage good data from the corrupted table. Start the database on a standalone engine and connect with Interactive SQL. Select and output data from the table with the following syntax:



      SELECT * FROM customer ORDER BY cust_id ASC >># c:\unload\customer.dat


This will output as much data as possible from that table to customer.dat, until the engine asserts. for convenience, order by the primary key.

Restart the engine, reconnect with Interactive SQL, and reverse the sort order:



      SELECT * FROM customer ORDER BY cust_id DESC >># c:\unload\customer.dat


The doubled > signs will cause the new output to be concatenated to the first set. The engine will assert again. Try to verify how much data has been lost, by comparing the number of rows written to the number expected, or by opening customer.dat and comparing the primary key value of the last row in the first pass, to the PK value in the last row of the second pass. Some data loss is inevitable, but if a significant number of rows are missing, you may need to continue the process with syntax like:



      SELECT * FROM customer where cust_id between 1600 and 20000 ORDER BY cust_id ASC >># c:\unload\customer.dat
This can become tedious, if multiple rows are corrupted, and these are widely separated. Fortunately, these rows are frequently grouped together on the primary key. If not, you might try sorting by a different column that has an index on it, or dropping all indexes on this table before trying to salvage the data.

When you have salvaged as much data as you can, you need to create a new database from Sybase Central or using the dbinit command. Be sure you match the collation sequence, blank padding setting, case sensitivity and page size of the original.

Start the new database on a standalone engine/personal server with lots of cache, and connect to the new database with Interactive SQL and type:



      READ C:\WORKING\RELOAD1.SQL


This should read all of the schema and data you have been able to salvage from the original database. The only other problem you are likely to encounter is when foreign key relationships are applied. If child records exist where there is no parent, the foreign key relationships will not be established. You will need to either delete the child records or replace/dummy up the parent records before this will work.

If your new database was created with a name different from the original, rename the file with DOS/Explorer and run dblog to rename the log file:



      DBLOG -t asademo.log asademo.db
It will be up to you the customer to verify that the data is complete and accurate.

It is strongly recommended that you upgrade your software to version 5.5.05 or later, as this type of corruption was much more common in earlier versions of the software.


共享共进共赢Sharing And Win-win Results
SYBASEBBS - 免责申明1、欢迎访问“SYBASEBBS.COM”,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@sybasebbs.com
您需要登录后才可以回帖 登录 | 站点注册

本版积分规则

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com

QQ|Archiver|PowerBuilder(PB)BBS社区 ( 鲁ICP备2021027222号-1 )

GMT+8, 2024-3-29 22:58 , Processed in 0.044111 second(s), 10 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表