WEB开发网      婵犵數濮烽弫鍛婄箾閳ь剚绻涙担鍐叉搐绾剧懓鈹戦悩瀹犲闁汇倗鍋撻妵鍕箛閸洘顎嶉梺绋款儑閸犳劙濡甸崟顖氬唨闁靛ě浣插亾閹烘鈷掗柛鏇ㄥ亜椤忣參鏌″畝瀣暠閾伙絽銆掑鐓庣仭缁楁垿姊绘担绛嬪殭婵﹫绠撻、姘愁樄婵犫偓娴g硶鏀介柣妯款嚋瀹搞儱螖閻樺弶鍟炵紒鍌氱Ч瀹曟粏顦寸痪鎯с偢瀵爼宕煎☉妯侯瀳缂備焦顨嗗畝鎼佸蓟閻旈鏆嬮柣妤€鐗嗗▓妤呮⒑鐠団€虫灀闁哄懐濮撮悾鐤亹閹烘繃鏅濋梺闈涚墕濡瑩顢欒箛鏃傜瘈闁汇垽娼ф禒锕傛煕閵娿儳鍩f鐐村姍楠炴﹢顢欓懖鈺嬬幢闂備浇顫夊畷妯肩矓椤旇¥浜归柟鐑樻尭娴滃綊姊虹紒妯虹仸闁挎洍鏅涜灋闁告洦鍨遍埛鎴︽煙閼测晛浠滃┑鈥炽偢閹鈽夐幒鎾寸彇缂備緡鍠栭鍛搭敇閸忕厧绶炴俊顖滅帛濞呭洭姊绘担鐟邦嚋缂佽鍊垮缁樼節閸ャ劍娅囬梺绋挎湰缁嬫捇宕㈤悽鍛婄厽閹兼番鍨婚埊鏇㈡煥濮樿埖鐓熼煫鍥ュ劤缁嬭崵绱掔紒妯肩畺缂佺粯绻堝畷姗€濡歌缁辨繈姊绘担绛嬪殐闁搞劋鍗冲畷顖炲级閹寸姵娈鹃梺缁樻⒒閳峰牓寮崒鐐寸厱闁抽敮鍋撻柡鍛懅濡叉劕螣鐞涒剝鏂€闂佺粯鍔曞Ο濠囧吹閻斿皝鏀芥い鏃囨閸斻倝鎽堕悙鐑樼厱闁哄洢鍔屾晶顖炴煕濞嗗繒绠婚柡灞界Ч瀹曨偊宕熼鈧▍锝囩磽娴f彃浜炬繝銏f硾椤戝洨绮绘ィ鍐╃厵閻庢稒岣跨粻姗€鏌ㄥ☉妯夹fい銊e劦閹瑩顢旈崟顓濈礄闂備浇顕栭崰鏍礊婵犲倻鏆﹂柟顖炲亰濡茶鈹戦埄鍐ㄧ祷妞ゎ厾鍏樺璇测槈閵忕姈鈺呮煏婢跺牆鍔撮柛鏂款槺缁辨挻鎷呯粙搴撳亾閸濄儳鐭撶憸鐗堝笒閺嬩線鏌熼崜褏甯涢柡鍛倐閺屻劑鎮ら崒娑橆伓 ---闂傚倸鍊搁崐鐑芥倿閿旈敮鍋撶粭娑樺幘濞差亜鐓涢柛娑卞幘椤斿棝姊虹捄銊ユ珢闁瑰嚖鎷�
开发学院数据库Sybase dbunload问题的修复 阅读

dbunload问题的修复

 2006-04-01 23:08:37 来源:WEB开发网 闂傚倸鍊搁崐椋庢濮橆兗缂氱憸宥堢亱闂佸湱铏庨崰鏍不椤栫偞鐓ラ柣鏇炲€圭€氾拷闂傚倸鍊搁崐椋庣矆娓氣偓楠炲鏁撻悩鎻掔€梺姹囧灩閻忔艾鐣烽弻銉︾厵闁规鍠栭。濂告煕鎼达紕校闁靛洤瀚伴獮鎺楀箣濠靛啫浜鹃柣銏⑶圭壕濠氭煙閻愵剚鐏辨俊鎻掔墛缁绘盯宕卞Δ鍐冣剝绻涘畝濠佺敖缂佽鲸鎹囧畷鎺戭潩閹典焦鐎搁梻浣烘嚀閸ゆ牠骞忛敓锟�婵犵數濮烽弫鍛婃叏椤撱垹绠柛鎰靛枛瀹告繃銇勯幘瀵哥畼闁硅娲熷缁樼瑹閳ь剙岣胯鐓ら柕鍫濇偪濞差亜惟闁宠桨鑳堕崝锕€顪冮妶鍡楃瑐闁煎啿鐖奸崺濠囧即閵忥紕鍘梺鎼炲劗閺呮稒绂掕缁辨帗娼忛埡浣锋闂佽桨鐒﹂幑鍥极閹剧粯鏅搁柨鐕傛嫹闂傚倸鍊搁崐椋庢濮橆兗缂氱憸宥堢亱闂佸湱铏庨崰鏍不椤栫偞鐓ラ柣鏇炲€圭€氾拷  闂傚倸鍊搁崐鐑芥嚄閼哥數浠氱紓鍌欒兌缁垶銆冮崨鏉戠厺鐎广儱顦崡鎶芥煏韫囨洖校闁诲寒鍓熷铏圭磼濡搫顫岄梺鍦拡閸嬪棝鎯€椤忓浂妯勯梺鍝勬湰濞叉ḿ鎹㈠┑濠勭杸闁哄洨濮烽悰銉╂⒒娴e搫甯跺鐟帮攻缁傚秴饪伴崼姘e亾閺冨牆绀冩い蹇庣娴滈箖鏌ㄥ┑鍡涱€楀褜鍠栭湁闁绘ɑ鐟ョ€氼喚绮绘ィ鍐╃厱妞ゆ劑鍊曢弸搴ㄦ煟韫囧鍔滈柕鍥у瀵潙螣閸濆嫬袝婵$偑鍊戦崹娲偡閳哄懎绠栭柍鈺佸暞閸庣喖鏌曢崶褍绨婚柟鍑ゆ嫹
核心提示: One type of database corruption that is reported to Technical Support is typically associated with Assertion Error 50213, "Page number on page does not ma
 

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 Prima(最完善的虚拟主机管理系统)ry 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 Prima(最完善的虚拟主机管理系统)ry 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 Prima(最完善的虚拟主机管理系统)ry 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.

1 2  下一页

Tags:dbunload 问题 修复

编辑录入:coldstar [复制链接] [打 印]
赞助商链接