4. 提高篇
如果忘記了sa的密碼,如何恢複.
1,首先停掉sybase ase服務.
2,在sybase 安記目錄%%\sybase\ASE-12_5\install\下, 修改RUN_SYBASE資料庫server啟動指令碼,在啟動命令最後加上 -psa儲存退出
3,用這個批處理啟動sybase 服務,在dos視窗中得到一個新的sa密碼.
4,用這個密碼登陸sybase,然後修改sa密碼.
5,將啟動指令碼中加的 –psa去掉,然後重啟動服務,用新改的sa密碼登陸就可以了.
4.1 為什麼資料庫交易記錄滿了,使用dump tran with no_log仍不能截斷日誌。
有兩種情況,可能出現這個問題。一是應用系統給ASE發送了一個使用者自訂事務,一直未提交,這個最早活躍事務阻礙系統截斷日誌。二是用戶端向ASE發送了一個修改數量大的事務,清日誌時,該事務還正在執行之中,此事務所涉及的日誌只能等到事務結束後,才能被截掉。
對於第一種情況,只要督促使用者退出應用或者提交事務,系統管理員便可清掉日誌。因為給AS E發送Dump transaction with no-log或者with truncate-only,它截掉交易記錄的非活躍部分。所謂非活躍部分是指伺服器檢查點之間的所有已提交或回退的事務。而從最早的未提交的事務到最近的日誌記錄之間的交易記錄記錄被稱為活躍的。從此可以看明,開啟的事務能致使日誌上漲,因為在最早活躍事務之後的日誌不能被截除。
對於第二種情況,道理也同上。只是在處理它時,需謹慎從事。如果這個大事務已運行較長時間,應盡量想法擴大資料庫日誌空間,保證該事務正常結束。若該事務被強行復原,ASE需要做大量的處理工作,往往是正向執行時間的幾倍,系統復原時間長,可能會影響正常使用的時間。
4.2 如何後備資料量大於2GB的資料庫
當在後備資料量大於2GB的資料庫時,可能會遇到以下錯誤:
o I/Oerror:
o operating system error,server device /backup/data. code 27 messages
o file too large.
這是由於後備檔案的大小超出了作業系統的使用者最大檔案限制。而有些作業系統不支援大於2GB的檔案,這時可以使用Backup Server將一個資料庫後備到多個檔案中。
? dump database pubs2 to "/usr/sybase/pubs2_dump.1"
? stripe on "/usr/sybase/pubs2_dump.2"
? stripe on "/usr/sybase/pubs2_dump.3"
? go
?
這種方法還可以提高後備及恢複的速度,但注意恢複也必須用相應多的裝置。例如:
1>load database pubs2 from "/usr/sybase/pubs2_dump.1"
2>stripe on "/usr/sybase/pubs2_dump.2"
3>stripe on "/usr/sybase/pubs2_dump.3"
4>go
4.3 如何更改ASE名稱(在UNIX、OPENVMS平台上)
在SYBASE產品中沒有特定的函數或者預存程序用來更改ASE Server的名稱,因此,只能手工修改某些參數或者配置來完成此任務。
需要修改interfaces檔案;更改RUN_server_name檔案名稱,並修改其內容,例如:-s(UNIX)、/SERVER(OpenVMS)後面所跟的參數(server 名稱);更改設定檔名;更改errorlog檔案名稱(如果需要);如果server名稱加在了表sysservers中,需要更改'srvname'、'srvnetname'列,可使用sp_dropserver、sp_addserver預存程序來實現。
在OpenVMS系統中還要修改RUN_server_name檔案中DSLISTEN的邏輯名稱,以及在使用startserver過程中/SERVER後面所跟的參數。然後,重啟SQL/ASE Server。確認DSQUERY、DSLISTEN環境變數已經更改為所需內容。
另外,如果SQL/ASE Server是被設定為遠程伺服器,還要修改與此server相關的系統資料表sysservers中的欄位以及interfaces檔案。
理論上例如設定檔、RUN指令碼、errorlog檔案不需要指定server 名稱(但是通常習慣指定server名稱)。在RUN startup指令碼中要指定server名稱。
您可以根據以下提綱完成此項任務:
? 如果server名稱加在了表sysservers中,用sp_dropserver刪除。
? Shut down server
? 編輯 interfaces檔案
? 更改RUN_server_name檔案名稱,並修改其內容,-s(UNIX)、/SERVER(OpenVMS)後面所跟的參數(server 名稱)
? 更改errorlog檔案名稱(如果需要)
? 修改DSQUERY、DSLISTEN環境變數(如果需要)
? 更改設定檔名(server_name.cfg、server_name.bak、server_name.nnn),在SYBASE安裝路徑下
? Start server
? 使用sp_addserver重新添加server(如果需要)
? 如果server是作為遠程server使用的,還需要刪除並重新添加。
4.4 如何在HP平台BCP OUT超過2G的資料
運行環境:
HP UNIX11,
SYBASE ASE12.0.02 SWR 9310
SYBASE OPEN CLIENT 11.1.1 EBF8633
SYBASE OPEN CLIENT 12.0
問題描述:
SYBASE資料庫中一個表BCP OUT時,輸出檔案大小到達2G時出錯,不能完成對此表的備份。具體現象表現為兩天對同一張大表BCP OUT輸出檔案的位元組數相同,沒有完成所有表的BCP OUT。
問題分析與解決辦法:
SYBASE OPEN CLIENT 11.1.1 EBF8960之前的版本不支援HP平台上的超過2G的BCP(OUT, IN)。OPEN CLIENT11.1.1 EBF8960 之後的版本,可以通過“管道”的方式支援檔案大小在2G以上的BCP(OUT, IN)。
方法如以下所示:
/usr/sbin/fsadm -F vxfs -o largefiles /dev/... //使檔案系統支援大於2G的檔案
/usr/sbin/mount -F vxfs -o largefiles /dev/...
mkfifo bcppipe // 建立一個管道
bcp tempdb..large_table out bcppipe -Usa -P -c & // 後台運行 BCP OUT
cat bcppipe > bcp.out // 把 BCP OUT 輸出從定向到可支援大
// 檔案的檔案系統
實施步驟:
1. 使檔案系統支援大於2G的檔案。
2. 由於現行BCP 備份程式有8個進程同時進行BCP OUT,所以需要建立8個管道 bcppipe0 – bcppipe7,保證在每一個進程中,可以向獨立的管道串列的寫入。
3. 為了不影響到原有的其它OPEN CLIENT應用,決定不升級當前的 OPEN CLIENT 11.1.1, 而是用OPEN CLIENT 12.0
4. 修改原調用BCP OUT進行批處理的 C 程式,使其使用OPEN CLIENT 12。BCP OUT的輸出先寫入管道,在由管道重新導向至檔案。
結果與結論:
1. 經過修改的程式可以正確的BCP OUT出大於2G的檔案。
2. 由於採用管道方式做BCP OUT,效能略有下降。
3. 需要注意,BCP IN 超過2G的大檔案,也需要使用管道的方式。所以調用BCP IN 的C 程式也需要修改。
4.5 如何將ASE SERVER移植到同種平台(相同作業系統)的系統上
提示:
? N1 這裡所列出的所有步驟,並不需要按順序執行,只是表明了在實驗中成功完成這項任務的順序。
? N2 SYBASE 提示您保留直至今日的ISQL指令碼,包括建立login、create database、disk init等等。使用這些指令碼會使您完成這項任務更加容易。這些指令碼也可以通過master中系統資料表的內容來重建,可能會繁瑣一些。
? N3 成功的關鍵在於目標系統中系統資料表的欄位與源系統中相應系統資料表的欄位相同。特別是:syslogins與sysdatabases中的'suid 以及 'dbid';sysusages中所有行的segmap、lstart以及size。
請在資料來源系統上執行以下操作:
? 對所有的資料庫進行資料一致性檢查(DBCC),並後備所有的使用者資料庫。
? 保留master 資料庫中資料表的內容,使用select * from table_name命令:
? sysdevices,sysusages,sysdatabses
? syslogins,sysservers,syssvrroles,sysloginroles,sysremotelogins
對於sysusages 表,請使用以下命令:
select * from sysusages order by dbid,lstart
對於sysdatabases 表,請使用以下命令:
select * from sysdatabases order by dbid
? 使用bcp命令拷貝(2)中所列出的系統資料表內容。
Unix:bcp master..table_name out file_name -Usa -Psa_password -c
Vms:bcp master..table_name out file_name /username="sa"/sa_password/char
? 保留sp_configure命令的執行結果
請在目標系統上執行以下操作:
? 安裝並配置新的ASE和Backup Server。
確認所指定的master、tempdb、sybsystemprocs大小至少等於資料來源系統上相應資料庫的大小,同時確認與資料來源系統相同的語言模組以及字元集。
? 啟動ASE,使之處於正常工作狀態。參照資料來源系統的配置(4中保留的執行結果)修改目標系統配置與之相同,並確認'device'參數值至少等於源系統此參數值。
? 在model、sybsystemprocs資料庫中任意執行幾個動作以判斷資料庫工作正常。請不要添加使用者、角色、修改系統資料表。
? 重啟ASE以測試新配置有效。
? 執行以下操作:
1> use master
2> go
1> sp_configure "allow updates",1
2> go
重啟ASE。
? 使用bcp命令拷貝(2)中所列出的系統資料表內容。
Unix:bcp master..table_name in file_name -Usa -Psa_password -b 1 -c
Vms:bcp master..table_name in file_name /user="sa"/sa_password/char/batch=1
? 建資料庫裝置,大小至少等於源系統中相應資料庫的大小。
? 運行create database和alter database的指令碼(或者使用命令列)。注意create、alter順序要與源系統create、alter順序一致,並使用與之相同的參數。完成後請對比源系統與目標系統中的sysdatabases、sysusages,使之完全相同,否則要重新做12這步工作。(請參照N3提示)注意:
? 在10.0以及更高版本中segmap欄位在做了資料庫load之後會被修改。
? 在確定需要相同的dbid時,則要採用與在源系統中create、alter相同的順序,在目標系統中做create、alter,並且使用相同的參數值。而這種需求僅僅是當資料庫中某些objects要參考不同的資料庫中的objects才會採用的。另外,這種需求只有在每一個資料庫中都被採用,完成的結果才會使得sysusages表中的segment、lastart、size欄位,或者是fragment與源系統中數值相同。運行以下命令,與原系統的輸出進行比較:
select * from sysusages order by lstart
? load使用者資料庫並執行dbcc檢測。
? 執行以下操作:
1> sp_configure "allow updates",0
2> go
重啟ASE。
後備master庫以及使用者資料庫。
4.6 如何擴充master資料庫空間
master資料庫只能擴充在master裝置上.那麼當master裝置已經沒有足夠的空間可使用時,請按以下步驟操作:
(此操作過程是以UNIX作業系統為例.SYBASE安裝路徑為/sybase)
1.備份master資料庫
啟動backup server,進入isql環境執行:
1>dump database master to '/sybase/master.dump'
2>go
shutdown SQL/ASE Server
1>shutdown
2>go
2.建立新的足夠大的master裝置
$buildmaster -d<master_device> -ssize(size以2K為單位)
例:$buildmaster-d/sybase/data/master.dat -s102400
3.修改RUN_servername檔案
編輯RUN_server_name檔案,-d參數指向建立的裝置名稱。
4.單一使用者模式重啟server
$startserver -f RUN_servername -m
5.執行installmaster指令碼
6.由備份檔案裝載master資料庫
1>load database master from '/sybase/master.dump'
2>go
7.修改sysdevices資訊
sp_configure 'allow updates', 1
go
begin tran
go
update sysdevices set high = 102399 , phyname = 'e:\sybase\data\master_test.dat' where name = 'master'
go
(102399=200*512-1 master裝置大小為200M)
commit tran
go
8.擴充master資料庫
1>alter database master on master裝置名稱=size(此值以M為單位)
2>go
例:alter database master on master=10
將master資料庫在master裝置上擴充10M
4.7 Invalid tdslength value
Error such as:
00:00000:00000:2001/03/22 16:10:07.80 kernel ksmask__rpacket: Invalid tdslength value 21536, kpid: 1310740
00:00000:00000:2001/03/22 16:10:20.87 kernel ksmask__rpacket: Invalid tdslength value 21536, kpid: 1376277
00:00000:00000:2001/03/22 16:10:51.27 kernel ksmask__rpacket: Invalid tdslength value 21536, kpid: 1441814
00:00000:00000:2001/03/22 16:15:38.22 kernel ksmask__rpacket: Invalid tdslength value 21536, kpid: 1507351
It can be a heavy network traffic. Indicated that this message is an informational message that comes from the network. Possible causes may be: the size of the packet that the server has received is different to the size that was sent by the client, ksmask__rpacket: The SQL Server does not validate the size of incoming TDS network packets. Bad incoming data may cause waiting processes to hang as the server waits for a very large amount of data on a network socket. When a corrupt TDS packet has been received, due to tcpip sending begining of another TDS packet before finishes sending the current TDS packet, the server terminates the process and outputs the above message. Kernel error "ksmask__rpacket: Invalid tdslength" indicates that tcp/ip has sent a corrupt TDS packet to sqlsvr.
Troubleshooting the error:
-max network packet size
-additional network memory
-any changes made to network recently
Increasing the network memory could be a solution. I can think of a situation where there is no memory left so the server is unable to store the new packets. This could lead to invalid tdslength. There are some cases where increasing network packet size and the additional network memory solved the problem.
In other cases, no further action was required as the message did not re-appear.
You can use sp_configure to increase the max network packet size and additional network memory, and also check if there's any issue with the network.
max network packet size:取決於應用中需要發送的資料包的大小。
additional network memory= max network packet size+ max network packet size*0.02
(並且使此數值為2048的倍數。)
4.8 如何將master裝置從UNIX的檔案系統移到裸分區
1. Turn off asynch io
1> sp_configure "allow sql server async i/o", 0
2> go
You will need to reboot your server for this to take affect.
2. Mirror the master device to the new raw partition.
1> disk mirror name = "master",
2> mirror = "absolute path to new master raw partition"
3> go
2. Unmirror master (this will permanantly break the mirror to the master
device (If you want to expirement, you can set mode = retain and remirror
a few times. See Reference Manual for syntax).
1> disk unmirror name = "master",
2> side = "primary",
3> mode = remove
4> go
3. Shut down your SQL Server. In your run server file, there is a "-d"
flag that has the path to your old master device. Change this to the path
for the new master device.
4. Restart your server and turn on asynch io.
1> sp_configure "allow sql server async i/o", 1
2> go
5. Shutdown and restart your server one more time to enable the
asynch io. Verify that your server is using asynch io by looking at the
start up sequence in the errorlog.
NOTE: It is best to perform this task with the server in single user mode.
You can do this while you recycle your server to disable asynch io in step 1
above by adding a "-m" to your run server file. Be sure to remove the flag
when you are finished.
4.9 如何產生bcp命令檔案(以pubs2為例)
本文適應於isql 11.*, 可通過isql -v得到版本
? 編輯一個文字檔select.sql,內容如下:
set nocount on
use pubs2
go
select "bcp pubs2.." + name + " out " + name + ".bcp -Usa -P -c "
from sysobjects where type="U"
go
? 如果是unix, 執行:
isql -Usa -P -b -i select.sql -o bcpout
chmod +x bcpout
? 如果是Windows, 執行:
isql -Usa -P -b -i select.sql -o bcpout.bat
將select.sql中的out換為in, 重複以上步驟即可得到bcp in的命令檔案
4.10 如何動手修改interfaces檔案
在一些HP和SUN的機器上,interfaces檔案中關於SERVER的資訊是以16進位的形式儲存的,必須要通過公用程式dscp才能進行修改。
實際上,我們只要瞭解了這些16進位資料的格式,也可以直接通過vi來更改interfaces檔案。
下面以e3000為例,介紹一下interfaces檔案的結構和格式:
用vi開啟/opt/sybase/interfaces,可以看到這些資訊:
E3000
master tli tcp /dev/tcp \x00021a0a9e4d51f80000000000000000
query tli tcp /dev/tcp \x00021a0a9e4d51f80000000000000000
其中:
/x0002 : 保留字,不必修改
1a01 : 16進位連接埠號碼,高位在左邊,轉換成10進位為:6666
9e4d51f8 : 16進位主機地址,
轉換成10進位為: 9e -- 158
4d -- 77
51 -- 81
f8 -- 248
即為: 158.77.81.248
可以修改的資訊其實主要就是主機地址和連接埠號碼,所以,如果需要,只要按照以上格式修改其中資訊即可。
4.11 關於tempdb的最佳化
預設情況下,tempdb資料庫是放置在master裝置上,容量為2M,而臨時資料庫是活動最為平凡的資料庫常常被用來排序、建立暫存資料表、重格式化等操作,所以tempdb的最佳化應該受到特別的關注。
第一步:將臨時資料庫與高速緩衝進行綁定。
由於暫存資料表的建立、使用,臨時資料庫會頻繁地使用資料緩衝,所以應為臨時資料庫建立快取,從而可以使其常駐記憶體並有助於分散I/O:
1、建立命名快取
sp_cacheconfig “tempdb_cache”,”10m”,”mixed”
2、重新啟動server
3、捆綁臨時資料庫到tempdb_cache快取
sp_bindcache “tempdb_cache”, tempdb
4、若有大的I/O,配置記憶體池
第二步:最佳化暫存資料表
大多數暫存資料表的使用是簡單的,很少需要最佳化。但需要對暫存資料表進行複雜的訪問則應通過使用多個過程或批處理來把表的建立和索引分開。以下兩種技術可以改善暫存資料表的最佳化
1、在暫存資料表上建立索引
1) 暫存資料表必須存在
2) 統計頁必須存在(即不能在空表上建立索引)
2、把對暫存資料表的複雜的使用分散到多個批處理或過程中,以便為最佳化器提供資訊
下面的這個過程需要進行最佳化:
create proc base_proc
as
select * into #huge_result from auths
select * from article, #huge_result where article.author_code=
#huge_result.author_code and sex=”0”
使用兩個過程可以得到更好的效能
1)
create proc base_proc
as
select *
into #huge_result
from auths
exec select_proc
2)
create proc select_proc
as
select * from article,#huge_result
where article.author_code=#huge_result.author_code and sex=”0”
說明:在同一個預存程序或批處理中,建立並使用一個表時,查詢最佳化工具無法決定這個表的大小。
4.12 ASE12.5.x的一條有用的命令: disk resize
syntax:
disk resize
name='device_name',
size=additional_space
After using this command,you could alter database on the device that you just resize
to add dev additional_space .Then we need not use command of 'disk init'.
4.13 如何更改字元集為cp936
(這裡SYBASE的安裝路徑為c:\sybase)
1.c:\>cd \sybase\charsets\cp936
2.c:\sybase\charsets\cp936> charset -Usa -Psa_pass -Sserver_name binary.srt cp936
3.在SQL環境中
1>select name,id from syscharsets
2>go
找到name為cp936對應的id(假設為117)
4.1>sp_configure "default character set id",117
2>go
5.重啟server兩次
(注:第一次啟動後,server會自動宕掉,需要第二次重啟後才能使用)