重建數據庫(不整理碎片)
您可參照以下步驟來執行一個不整理磁盤碎片的重建任務。
1、 關閉SQL Anywhere 和Adaptive Server Anywhere 數據庫服務器因為版本10 的dbunload
實用工具不能針對運行在較早版本數據庫服務器上的數據庫工作。例如:
dbstop -c "DBF=mydb.db;UID=DBA;PWD=sql"
2、 確保版本10 的實用工具在系統路徑中優先於別的工具。
3、 使用dbunload 實用工具創建一個reload.sql 文件。例如:
dbunload -c "connection-string" directory-name
4、 使用初始化工具(dbinit)創建一個新數據庫。或在Sybase Central 中創建一個新數據庫。例
如:
dbinit new.db
5、使用Interactive SQL 連接新數據庫:
dbisql -c "DBF=new.db;UID=DBA;pwd=sql"
6、 執行以下命令將磁盤空間加入數據庫中以便將數據加載。請務必增加足夠大的磁盤空間以
容納數據。磁盤空間必須是連續的,這樣可以提高加載的性能。例如:
ALTER DBSPACE system ADD 200MB
7、 在Interactive SQL 中將reload.sql 應用到數據庫中。
dbisql -c "DBF=new.db;UID=DBA;pwd=sql" reload.sql
已知問題
如果在運行dbunload 實用工具或卸載向導的過程中重建失敗,您可使用以下步驟來幫助
判斷失敗原因:
1、 運行使用-n 選項的dbunload 命令:
dbunload -c "connection-string" -n directory-name
2、創建新的,空白的版本10 數據庫
dbinit test.db
3、 將reload.sql 應用至空白的數據庫中:
dbisql -c "DBF=test.db;UID=DBA;pwd=sql" reload.sql
4、 根據將reload.sql 文件應用到新數據庫的消息,酌情修改reload.sql 或原始數據庫。
以下表格列出了可能導致重建失敗的原因和其解決辦法。
已知問題:
如果表名有對象擁有者前綴時,存儲過程或觸發
器語句中的DECLARE LOCAL TEMPORARY
TABLE 語句產生表達式錯誤。
解決辦法:
去掉對象擁有者。
已知問題:
如果CREATE TRIGGER 語句不包含觸發器依
賴表的擁有者,而出現“Table 'table-name' not
found”錯誤的。
解決辦法:
將表名加上對象擁有者前綴。
已知問題:
如果一個對象名稱(例如表、列、變量或參數名)
與最新版本的SQL Anywhere 保留字相關(例如
NCHAR),則加載失敗。例如:
CREATE PROCEDURE p( ) BEGIN DECLARE NCHAR INT; SET NCHAR = 1; END
解決辦法:
將使用的保留字替換成別的名稱。對於變量,前
綴的@字符通常可用來避免命名沖突。詳情請參
閱SQL Anywhere 文檔的“保留字”。
已知問題:
如果數據庫是被版本9 或更早版本的dbunload
卸載的,則reload.sql 文件中包含了對
ml_add_property 系統過程的調用,但這個過程
在版本10 中不存在
解決辦法:
請使用版本10 的卸載工具。
已知問題:
如果數據庫是被版本9 或更早版本的dbunload
卸載的,則使用T-SQL 書寫的外連接(OUTER
JOINS, *=或者=*)所創建的視圖可能不會被正確
加載:
解決辦法:
在加載腳本中加入以下行:
SET TEMPORARY OPTION tsql_outer_joins='on'
您必須後續使用T-SQL 重寫視圖。