Sybase ASE學習筆記

      經過這兩天的學習,因爲以前徹底沒有接觸過sybase,發現sybase跟oracle或者SQL server都有比較大的差異,一是須要配置運行sybase的環境,二是sybase採用的是Transaction-SQL。三是,其數據庫管理開始時讓我很不習慣。 html

      在接觸別人安裝了的sybase(linux 64bit-ase15.7)時,我發現sybase總是連不上,經過showserver命令來查看,shell卻說沒此命令,接着進入其安裝 SYBASE_HOME/ASE-15_0/install/檢查了,showserver沒有問題,但啓動./startServer.sh時,發現錯誤 了,出現了can execute file RUN_SYBASE。此刻我發現了我與本目錄的RUN_*****不一樣,雖然意識到不一樣,但我只是mark下它而沒有進行進一步思考。經過上網搜索資 料,若是sybase是安裝成功,那麼應該就是環境問題了。因此我調用./SYBASE.sh(我覺得起碼當前的環境就配好了),因而我就調用isql -Usa -S服務名、isql -Usa -S192.168.*.*和isql -Usa -S192.168.*.*:5000 以及它們各類變形,其間還需用注意得在SYBASE_HOME/OCS-15_0/bin目錄下(即存在isql.sh腳本文件的目錄下),這裏花了我不 少時間來弄明白,最後經過同事的協調,請到了高人給我展現了一下其登錄過程,我才弄明白。 linux

小結:1.出現can execute file RUN_SYBASE的錯誤多是安裝者修改了默認服務名而引發的。 sql

       2.調用./SYBASE.sh是不能夠把環境信息導入當前的shell中的,要使用source ./SYBASE.sh才行。另外可使用export -p來看當前shell的環境狀況。 shell

       3.鏈接時出現了LANG的錯誤,可能就是sybase不識別系統使用的語言,我遇到的是因爲多語言引發的。export應該能夠了 。 數據庫

       4.另外還有一個方法能夠快速查sybase有沒啓動服務。lsof -i:端口號。端口號能夠在SYBASE_HOME/interfaces能夠查看端口號。windows


       5.關閉服務能夠經過Kill進程,或者經過isql以SA用戶登陸使用shutdown go來關閉數據庫bash


       6.開啓數據庫,./startserver.sh -f RUN_服務名 -f RUN_備份服務名服務器


some points in sybase:網絡

sybsystemprocs 系統過程數據庫oracle

sybsystemdb 兩階段提交事務數據庫

tempdb 臨時數據庫

master數據庫存儲有關用戶數據庫和設備的信息,但不要放置用戶對象,這會致使master的事務日誌很快就滿。若是事務日誌的空間已用完,則沒法使用dump transaction命令來釋放master數據庫中的空間。

注意:不要將用戶數據庫存儲在主設備上。在更改配置參數時要謹慎。


用於磁盤資源的命令:


命令 

任務 

disk init 

name="dev_name" 

physname="phys_name" ... 

使某個物理設備可供特定的Adaptive Server使用。 

指派數據庫設備名稱(dev_name),用於在其它 

Adaptive Server命令中表示該設備 

sp_deviceattr logicalname、 

optname、optvalue 

更改現有數據庫設備文件的dsync設置 

sp_diskdefault "dev_name" 

向缺省數據庫空間的常規緩衝池添加dev_name. 

disk resize 

name ="dev_name" 

size =addtional_space 

動態增長數據庫設備的大少 

disk mirror 

name="dev_name" 

mirror ="phys_name" 

在特定物理設備上鏡像數據庫設備 


在建立登陸用戶時,最好指定好數據庫,儘可能不用master數據庫,以避免master有包含用戶建立的數據庫對象 


使用配置文件可有如下幾方面的好處: 

1.可使用同一個配置文件,在多臺服務器上覆制某一特定配置文件。 

2.可以以某個配置文件爲基準測試服務器的配置值。 

3.能夠在實際設置參數值以前,先使用配置文件對參數值進行檢查。 

4.能夠建立多個配置文件,以便須要更改資源時在它們之間轉換。 


把日誌放到獨立的數據庫設備上,能夠: 

1,容許使用dump transaction 命令而不是dump database命令,從而節省時間和磁帶 

2,容許創建固定長度的日誌,防止它與其餘數據庫活動爭用空間 

3,在日誌段上建立缺省的可用空間或值監控,並容許在數據庫的日誌和數據部分建立額外的可用空間監控。 

4,提升性能 

5,確保硬盤崩潰後的徹底恢復。 


事務日誌的大小由下列因素決定: 

1.相關數據庫中更新活動的數量 

2.事務日誌轉儲的頻率程度 


查看報告日誌使用狀況:dbcc checktable(syslogs) 

查看數據庫使用狀況: sp_spaceused 先經過 use 數據庫名 go 去到想查看的數據庫裏先。 

sp_spaceused輸出結果列解析: 

database_name 正在檢查數據庫的數據庫名稱 

database_size 數據庫中的大小 

reserved 分配給全部在數據庫中建立的表和索引的空間量。 

data,index 數據和索引所用的空間。 

unused 已保留但還沒有被已存在的表和索引所用的空間量。 

若是想刪除設備,先得刪除使用該設備的數據庫。 

將日誌和數據在同一設備上的數據庫的事務日誌移到單獨的數據庫設備上:sp_logdevice dbname,devname 

1,只有在單用戶模式下才能執行。2,只將sp_logdevice    用於日誌和數據都在同一設備上的數據庫,不要將它使用在具備單獨的日誌設備的數據庫上。 

查看數據庫大小和設備信息:sp_helpdb [dbname]。 


在sybase的數據類型中,只有可變長的數據類型才能置NULL值,如varchar(n)和varbinary(n).另外輸入的帶有E符號的文字貨幣都會被當作float。 


datetime 8個字節,date time smallldatetime 4個字節 

sybase不能進行一下轉換: 

1.將smallint數據轉換爲datetime 

2.datetime數據轉換成smallint 

3.將binary或varbinary數據轉換爲smalldatetime或datetime數據 


@@boottime 返回Adaptive Server 上次啓動的日期和時間 

@@errorlog 返回指向Adaptive Server錯誤日誌所在目錄的完整路徑。 

@@maxpagesize 返回服務器的邏輯頁大小。 

@@servername  返回Adaptive Server的名稱


@@version   返回sybase的版本

臨時表名以#開頭,變量名以@開頭


my experiences:

在使用sybase的這幾天內,遇到比較多問題:

一.如何設置linux用戶登陸時自動執行source SYBASE.sh?(~/.bash_profile中添加source SYBASE.sh)

二.sybase的數據庫使用經驗:

1.增長登陸用戶 以sa登陸尋使用sp_addlogin loginname,password,defaultdb 增長用戶。


                       sp_adduser loginname把用戶添加到當前數據庫中。


                      要注意的點是:sp_addlogin中雖然加入默認登陸的db,但只執行該語句並不能使用戶有登陸默認數據庫的權限,必定得使用sp_adduser加入數據庫後才能訪問該DB。

2.權限管理跟oracle語法差很少,只是有個別權限名字不一樣而已。create default、create procedure、create rule、create table、create view、create function。省得麻煩,我一般grant all。all就等於前面6個權限。若有懷疑,可經過如下方式驗證: 


                用dbo登陸數據庫, 使用該語句能夠查詢用戶具備的權限:select a.uid,a.name,b.action from sysusers a,sysprotects where a.uid=b.uid  


                關於sysusers和sysproctects的詳情可下載官方的tables文檔來看。     


3.設備的新建:

disk init

name="server中惟一識別符",   --不要漏了逗號

physname="物理路徑",

size="1g"  --不加單位爲多少頁,頁的大小在建立服務器時已制定,能夠經過select @@maxpagesize來查詢,大小寫都可。

改變設備的大小(只能增大):在某些版本中沒有disk resize

disk resize

name="dev_name",

size="addtional_space" -- 增長的大小

sybase ase默認的設備個數爲10。

4. 新建數據庫.

create database dbname

on dev_name=size

log on dev_name=size

在此過程,服務器將執行如下動做:

①.檢查數據庫名是否惟一

②.檢查數據庫所依賴的設備是否可用,即檢查該設備是否存在,和它滿不知足數據庫要求的空間大小。

③.服務器將自動爲該數據庫尋找惟一的dbid.

④.在master的sysusages記錄數據庫佔用設備的信息。

⑤.在sysdatabases中新增一行。

⑥.根據model數據庫生成該數據庫的系統表

⑦.由於上述語句沒有for load,因此服務器會清除該數據庫設備的剩餘頁。

5.數據庫與設備的關係

設備根據其用途大概爲分爲3種:

①數據設備 ②日誌設備 ③混合設備

但強烈不建議使用混合設備。緣由:下降數據查詢速度(具體看上面)。

雖然設備與數據庫是多對多的關係(即一個設備能夠對應多個數據庫),但我的不建議這樣作,建議一個數據庫對應一個數據設備和一個日誌設備。想要刪除設備,就先得刪除依賴它的數據庫,使用sp_dropdevice刪除設備。

3、遇到鏈接錯誤的問題:當使用isql登陸服務器時,出現這樣的錯誤:ct_connect(): network packet layer: internal net library error: Net-Lib protocol driver call to connect two endpoints failed。

一看到這個錯誤,應該是網絡出現了問題,但使用lsof -i:5000 和RUN_servername來查看sybase服務器的狀態,都沒有問題,使用命令hostname -i也沒有發現問題。所以具體形成此錯誤的緣由我還沒有弄明白,但經過重啓服務就把它就解決了。這個錯誤讓我想起以前我在oracle中遇到的一個問題:我 把原來關閉了orcle的console服務打開(其餘相關的服務原來就開啓了),打開後,我用cmd以sysdba的分配登陸sqlplus時,報一個 監聽錯誤,我用NET MANAGER查看監聽信息,與ora的配置文件中信息對比,都沒有發現錯誤,最後重啓一個listener服務就能夠了。我想可能console的服務 與listener的服務存在先後順序的關聯。


sybase的字符集問題:

1.安裝字符集:到sybase安裝目錄下的charsets的目錄,選擇要安裝的字符集,使用charset -Usa -Ppassword -Sserver_name binary.srt charset_name

2.查看默認字符集:sp_helpsort

3.設置默認字符集:sp_configure "default character set id",id 在master數據庫下運行,id能夠經過select * from syscharsets查詢。


日誌滿了的問題:

兩種解決方法:1.手動清除 truncate transaction dbname with truancate_only 固然若有須要,你能夠先備份數據。

                      2.自動清除 sp_dboption dbname,"trunc log on ckpt",true (在master下運行,且須要在dbname下運行checkpoint才能生效,有提示信息的)


修改設備數量:sp_configure "number of devices",30 默認爲10個

查看當前用戶信息:sp_displaylogin

查看最大鏈接數:select @@max_connections

查看當前鏈接數: select @@connections

查看最大用戶鏈接數:sp_configure "number of user connections"


查看sybase鎖的個數(我的認爲挺重要的參數):sp_configure 「number of locks」


建立登陸用戶: sp_addlogin username,userpassword

把某個數據庫的登陸權限授予用戶:use dbname。sp_adduser name

改變某個數據庫的擁有者給某個用戶: use dbname。sp_changedbowner username(這個用戶不能是該數據庫的用戶)

修改用戶參數:sp_modifylogin username,option,option_value


option有:authenticate with-登陸鑑別

defdb-默認登陸數據庫

deflanguage-用戶缺省語言的正式名稱

fullname-用戶的全名

"add default role"-增長用戶角色

"drop default role"-刪除用戶角色

"passwd expiration"-口令有效日期(天數:0-32767)

"min passwd length"-密碼最小長度

"max failed_logins"-容許登陸失敗次數

log script-登陸時運行的腳本


 使用sp_who能夠查看那當前因此用戶和進程信息


dbcc traceon(3604)打開跟蹤,使得dbcc的運行結果打印在控制檯上。


dbcc sqltext(pid)就能夠打印出進程號爲pid正在運行的SQL語句。

sybase遠程備份: 

環境描述:1.機器A是windows機器,sybase的備份服務器名爲:A_BS 版本ase 15.7 頁大小:8K 

                  2.機器B是linux機器,sybase的備份服務器名爲:B_BS 版本ase 15.7 頁大小:8K 

                  3.A,B聯網 

注意點:若是A,B的備份服務名重複,須要更改或新建(何嘗試過)。另外,sybase備份服務必須處於開啓狀態. 

問題:把B機器上名爲XXX的數據庫遠程備份到A機器上? 

思路:sybase備份數據庫要備份,必須使用到備份服務器,爲了讓B識別到A的備份服務器,所以在B中須要添加A的sybase備份服務器,再使用備份命令備份相應的數據庫到遠程服務器的路徑就能夠了。 

步驟: 

1.在linux下,修改${SYBASE_HOME}/interfaces,添加A_BS服務器(模仿已存在的服務,主要是變動服務名,遠程機器名或IP,端口)(windows平臺下該文件爲sql.ini) (也可使用dscp(linux平臺)或dsedit(windows平臺)) 

2.用sa登陸系統,經過sp_addserver A_BS,ASEnterprise,A_BS.接着設置A_BS的serveroption 

sp_serveroption A_BS,"timeouts",true  --不保持常鏈接,若是機器B在一點時間段內沒有對A_BS操做的話,連接會自動斷開 

sp_serveroption A_BS,"net password encryption",false --密碼在網絡傳輸中不加密 

sp_serverooption A_BS,"readonly",false


(設置後要重啓本地的ASE服務)


3.使用命令備份


dump database XXX to "F:\XXX_backup.dmp" at A_BS 

4.恢復數據庫 

load database XXX from "F:\XXX_backup.dmp" at A_BS 

另一種備份方法。 
PS:這裏指的數據庫遷移僅限於sybase到sybase(版本,頁大小一致的)。 
環境描述、問題都同窗習筆記2同樣,即把linux上的數據庫遠程備份到windows下。 
先把要使用的工具介紹一下:1.ddlgen 2.bcp 
1.ddlgen在sybase ase 12.5之後纔出現的工具,ddlgen參數說明可參考 http://infocenter.sybase.com/help/index.jsp(

Adaptive Server Enterprise 15.7 >  Utility Guide >  Utility Commands Reference

)

2.bcp這個工具可在cmd下bcp -help來查看用法,另外還能夠參考 http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc30191.1570100/doc/html/san1367605030412.html 
問題:如何把linux下的數據庫備份到windows下呢? 
步驟: 

1.爲了讓在windows下能識別遠程linux下的sybase服務,所以必須在sql.ini(路徑:${SYBASE_HOME}\ini\)中添加該服務。

另外sybase也提供了修改接口文件的工具,在windows下是dsedit.exe,在linux下是dscp

2.使用ddlgen工具導出數據庫結構。

ddlgen -U用戶名 -Ppassword -Ssybase -Ddb_name -OC:\script.txt(注:能夠根據須要添加-E錯誤日誌、-L過程日誌和-J指定字符)

這裏的用戶名最好是DBO或者是SA,理由:經比較普通用戶導出的文件和DBO或者SA導出的文件,我發現普通用戶導出的文件在文件的開頭會少了DBOPTION的設置(最後會use 目標db 運行checkpoint,從而使下方的增長用戶腳本運行正確),致使腳本會出錯。

3.使用bcp工具導出數據庫的數據。

首先經過db鏈接工具連接要導出數據的數據庫。 
運行如下sql: select 'bcp db_name..' + name + ' out C:\data\data_' + name + '.txt' + '  -U用戶名 -Ppassword -Ssybase -c -t"|"' from sysobjects where type='U' 

其中紅色部分是爲了隔離\和',省得系統識別爲轉義,藍色部分可選,可不填寫格式或根據須要更改格式都行。(bcp中有t這個參數,它的做用是列與列之間的數據用什麼分割,因爲本人的經歷,建議選擇分隔符時必定要選擇比較特殊的符合,這樣能夠避免在bcp in的時候出錯)

打開notepad,把sql的結果複製到notepad中並保存,修改文件後綴,改成bat。(linux下改成shell腳本)

最後雙擊運行就能夠了。 

恢復數據庫 
1.用isql工具,isql -Usa -Ppassword -Ssybase -iC:\script.txt  
2.把上面的bat文件中out改成in,雙擊運行就能夠了。 

我的比較推薦使用這種方法,一是所須要的物理空間較小,二是應該能夠根據實際須要來修改ddl腳本。 在實際時候過程當中,還會遇到字符集的問題,這個問題實踐較少,內容有待補充,但值得一提是的bcp的-Y參數:specifies that character-set conversion is disabled in the server, and is instead performed by bcp on the client side when using bcp out 。NOTE:During bcp out, all character-set conversion is done in the server. 


最後跟你們分享一下:在導入的時候遇到報錯,可使用bcp -e保存錯誤日誌,由於console臺上打印的信息有時候是不完整。

相關文章
相關標籤/搜索