blogspot.com-GA4

星期二, 9月 30, 2008

Sybase ASE 常見問與答

來源


ASE 安裝過程中,安裝程式一直停留在初始化資料庫這一步,無法繼續

這是一個莫明其妙的 bug,在初始化庫的過程中,tempdb 滿了!
  解決方法:
    此時,ASE 服務實際已經啟動,因此,可以通過 isql 登錄,然後修改 tempdb 的大小:
    1. 在命令行下鍵入以下命令,注意斜體部份用實際服務名代替:
     c:\>isql -Usa -S 服務名
    2. 鍵入下面下劃線的命令:
     1>alter database tempdb on master ="2M"
     2>go


為什麼生產環境不要設置 truncate log on checkpoint?
  有些用戶貪圖簡便,在生產環境中設置了 truncate log on checkpoint 。其原意不外是避免因寫滿日誌而導致的業務停頓。殊不知,這樣的設置可能帶來不可挽回的災難。因為當事務被截斷後,從最近一次全備到當前的事務均不可能再恢復了!如果這期間出現問題,如磁片損壞,則將導致大量資料丟失。
  在生產環境中,應通過配置合理的備份策略來進行全備和增量備份。典型的策略是每週一次全備,每天一次增量備份。用戶應根據自身應用的實際情況(資料量、資料增量、資料重要性等因素),合理調整,如改為一天兩次增量備份。如果需要大量導入資料,可能寫滿日誌,那麼可能臨時設置 truncate log on checkpoint,但需要注意的是:完成資料導入後,應立即取消此設置,並馬上進行全備。  


如何分離日誌與資料?
  1、備份資料庫,包括 master 和你要分離資料與日誌的應用庫(廢話,根據 Sybase ASE 系統管理員日常維護指南,這一步是必不可少,以至於不用寫出來的步驟);
  2、檢查日誌是否有單獨的存放設備,如有,則直接到第5步;
  3、增加一個設備:disk init .....;
  4、alter database db_name log on new_log_device=xxx
  5、sp_dropsegment logsegment, db_name, device_name
  6、查看是否已分離(sp_helpdb或sp_helplog);
   需要注意的是,執行 sp_helplog 會提示以下類似資訊:
No valid log device can be found to contain the starting logpage of 'xxxx', on database 'xxxxx'. Perhaps the segment mapping of database has changed recently. Please inspect the sysusages catalog and contact your system administrator.
  你大可不必緊張。段(segment)只是管理以後如何為物件分配空間,增加和刪除 segment 並不移動當前的已分配空間。日誌至少有一個擴充(extend)位於以前的 segment 上(還記得嗎,為物件分配存貯單元時,實際是以 extend 為單位的。)。如果當前 extend 被填滿,需要再為日誌分配時,ASE會在新的 segment 上分配(segment 約束它不得不這麼做)。此時,截斷日誌就可以回收以前分配的 extend 了。
  7、因此,如果不想看到 sp_helplog 的“錯誤輸出”,你可以創建一個臨時表,然後往面插入足夠的資料,然後截斷日誌;
  8、老規矩,也是很重要的一步:備份資料庫,包括 master 和你分離資料與日誌的應用庫。


如何刪除tempdb資料庫在master設備上的記錄?
摘自 hobbylu 的博客。
sp_dropsegment 'system','tempdb','master'
go
sp_dropsegment 'default','tempdb','master'
go
sp_dropsegment 'logsegment','tempdb','master'
go
begin tran
delete from sysusages where dbid=2 and segmap=0
go
update sysusages set lstart=0 where dbid=2(注意這裏僅僅只考慮了一個tempdb設備的情況)
commit
go


新安裝ASE或新建服務後,用戶端無法連接伺服器
  在安裝完 ASE 或新建服務後,伺服器上能使用 dsedit 連接資料庫服務,但用戶端無法連接。
  通常的原因是資料庫服務綁定了 127.0.0.1,使用 dsedit,或直接修改 interfaces 檔,綁定確實的 IP 即可。


新安裝ASE或新建服務後,無法連接備份伺服器
  在安裝ASE或新建服務後,試圖 load 或 dump 資料庫時,總是提示如下資訊:
Can't open a connection to site 'SYB_BACKUP', See the error log file in the SQL Server boot directory.
error code = 7205
  通常,這是由於 ASE 安裝/服務初始化程式的 BUG 導致的。在創建服務時,ASE 會創建一個名為類似 XXXX_BS 的備份服務,同時會在 master..sysservers 中插入一條對應記錄。以服務名 FLYBAEN 為例,下面是 interfaces 檔和 sysservers 中的記錄:
  interfaces 檔內容:
FLYBEAN_BS
master tcp ether FLYBEAN_LINUX 5001
query tcp ether FLYBEAN_LINUX 5001

sysservers 的記錄:(select srvname, srvnetname from sysservers where srvname='SYB_BACKUP')
srvname srvnetname
------------------------------ --------------------------------
SYB_BACKUP FLYBEAN_BS
  通常默認的備份伺服器就是 SYB_BACKUP 。在 load/dump 時,ASE 通過 sysservers 獲取備份伺服器對應 interfaces 的資訊,然後在 interfaces 檔中搜索該服務的實際位置(IP和埠)。在此例中,ASE 通過 sysservers 得到 interfaces 中的服務名為 FLYBEAN_BS,然後在interfaces 中獲取該服務的物理資訊。如果 ASE 無法通過 sysservers 中的 srvnetname 在 interfaces 中獲取相關資訊,則會報上面的錯誤。
  那麼解決辦法就是非常簡單的。
  方法一:修改 interfaces 檔,將服務名改為 sysservers.srvnetname 對應的值;
  方法二:修改 sysservers 中相應記錄的 srvnetname 的值為 interfaces 檔中的服務名。


如何配置異地備份?
  自 12.5.0(12.0是否支持待確認) 開始,ASE 支持異地備份,具體方法舉例如下:
  假設兩台 ASE 資料庫伺服器,分別為 A 和 B,資料庫服務分別為: SRV_A, SRV_A_BS; SRV_B, SRV_B_S 。我們要把 B 上的資料庫 DB_1 備份到 A 上。
  1. 修改 B 上的 interfaces 檔,增加 SRV_A_BS 的配置,如:
    SRV_A_BS
      master tcp ether A BS_PORT
      query tcp ether A BS_PORT
  2.用 isql 登錄 SRV_B,為 SRV_B 增加一個遠端服務:SRV_A_BS
    sp_addserver "SRV_A_BS",null,"SRV_A_BS"
  3.測試:dump database DB_1 to 在 A 上的路徑及檔案名 at "SRV_A_BS"

系統崩潰了,沒有備份,但設備檔還存在,如何恢復資料庫?
  有的時候,系統崩潰了,手上也沒有資料庫的備份或者是備份太舊了,但僥倖的是設備還在,並且是完整的,這時可以通過檔COPY的方式恢復資料庫。
  情況一、所有設備,包括 master ,均是完整的:
  這種情況是最簡單的,只需要先備份設備檔(包括master,copy 到安全的地方),然後重新安裝系統,建服務(保持頁面大小、編碼和排序與以前一樣),然後停止服務,按原目錄將所有設備檔拷貝回來,再重啟服務即可。新建的服務名可與舊服務不同。建議把 服務名.cfg 也複製過來,省掉參數配置。
   情況二、應用的設備是完整的,但沒有master了:
  方法一、這種情況下要恢復資料庫就需要原來的設備使用情況表了。重新安裝系統,建服務,然後按原設備情況建設備(大小、位置保持和原來一致),接下來根據記錄下來的設備使用情況建庫,順序以及佔用的空間要和以前的一致。然後停服務,將應用的資料庫設備複製回來,重啟服務即可。請參考Sybase ASE 系統管理員日常維護指南的建議,定期備份 master 資料庫。
  方法二、
  1.重新創建 master 設備
   buildmaster -dthe_full_path_of_master_device -sthe_size 12.5版本以下
   dataserver -b (Windows: sqlsrvr -b)12.5(含12.5)以上 
  2.檢查並修改 RUN_XXX 檔,指向新創建的 master.dat,並增加 -T3608
  3.命令行啟動服務
  4.調整 master 庫的大小(可選)
  5.重新構建 master..sysdevices 數據
   disk reinit name="device_name", physname="full_path_of_device", vdevno=device_no,size=size_of_device
  6.重新構建 master..sysusages 數據
   disk refit
  8.修改恢復回來的資料庫名
  9.使用 isql,安裝 master 和 model
  10.創建登錄和用戶
  11.去除 RUN_XXX 檔中的 -T3608 標誌,重啟動服務


忘記了sa的密碼,怎麼辦?
  修改RUN_XXXX腳本,在其後面添加 -psa,然後在命令行運行該腳本,ASE會給出重新生成的密碼,用此密碼登錄並修改。
  注意:修改密碼後,應及時去掉添加的-psa。


調整參數後,ASE 無法啟動
  這是由於參數配置不正確,導致無法啟動。可以通過直接修改配置檔,或者將系統自動備份的配置檔拷貝回來。
  配置檔位於 ASE 安裝目錄下,命名規則為:服務名.cfg,如:/opt/sybase/ASE-15_0/FLYBEAN.log。每次調整參數後,ASE 會將備份以前的配置參數,形成諸如 服務名.三位序號 的文件,如:FLYBEAN.001,每次備份,序號會加 1。


如何跨平臺移植 ASE 資料庫?
  此處的跨平臺是指硬體平臺,如 Sparc <-> X86,它們之間存在高低位元組順序不同的問題。
•   BCP in/out;
•   如果 ASE 版本為 12.5.3 及以上,則可以通過 Dump/Load 功能直接載入。
  
如果不小心直接刪除了日誌的設備檔,如何恢復資料庫?
  首先,應盡可能從作業系統中恢復被誤刪除的設備檔;  如果不能恢復,可創建一個和被刪除設備檔大小相同的新設備檔,然後運行 dbcc rebuild_log。  下面給出一個具體的測試用例:
-- 創建測試資料庫 test
use master
go
disk init name='test_dat_dev',physname='/opt/sybase/data/test_dat_dev.dat',size='50M'
go
disk init name='test_log1_dev',physname='/opt/sybase/data/test_log_dev1.dat',size='10M'
go
disk init name='test_log2_dev',physname='/opt/sybase/data/test_log_dev2.dat',size='10M'
go

create database test on test_dat_dev='40M' log on test_log1_dev='5M', test_log2_dev='2M'
go

-- 產生一些日誌
use test
go
create table test (
id int not null,
name char(20) not null
)
go
insert into test values(1,'aaaaaaa')
insert into test values(2,'bbbbbbb')
insert into test values(3,'ccccccc')
insert into test values(4,'ddddddd')
go


-- 創建另一個資料庫,我們需要一個與測試資料庫第一個日誌設備相同的設備檔
use master
go
disk init name='test1_dat_dev',physname='/opt/sybase/data/test1_dat_dev.dat',size='50M'
go
disk init name='test1_log1_dev',physname='/opt/sybase/data/test1_log_dev1.dat',size='10M'
go
disk init name='test1_log2_dev',physname='/opt/sybase/data/test1_log_dev2.dat',size='10M'
go

create database test1 on test1_dat_dev='40M' log on test1_log1_dev='5M', test1_log2_dev='2M'
go

-- 作業系統操作:刪除 test_log_dev1.dat,然後重啟 ASE
mv test_log_dev1.dat test_log_dev1.back

-- 檢查一下資料庫的狀態,然後停 ASE
select name, status from sysdatabases
go
shutdown
go

-- 作業系統操作:拷貝 test1_log_dev1.dat 為 test_log_dev1.dat,重新啟動 ASE
cp test1_log_dev1.dat test_log_dev1.dat

-- 修改測試資料庫狀態,並重新啟動 ASE
sp_configure 'allow update',1
go
begin tran
go
update master..sysdatabases set status=-32768 where name='test'
go
commit
go
sp_configure 'allow update',0
go
shutdown
go

-- 重建日誌,可選步驟
dbcc traceon(3604)
go
dbcc rebuild_log(test,0,0)
go
online database test
go

沒有留言: