通過這兩天的學習,由於之前完全沒有接觸過sybase,發現Sybase跟Oracle或者SQL Server都有比較大的差別,一是需要配置運行sybase的環境,二是Sybase采用的是Transaction-SQL。三是,其數據庫管理開始時讓我很不習慣。
在接觸別人安裝了的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腳本文件的目錄下),這裡花了我不 少時間來弄明白,最後通過同事的協調,請到了高人給我展示了一下其登陸過程,我才弄明白。
小結:1.出現can execute file RUN_Sybase的錯誤可能是安裝者修改了默認服務名而引起的。
2.調用./SYBASE.sh是不可以把環境信息導入當前的shell中的,要使用source ./Sybase.sh才行。另外可以使用export -p來看當前shell的環境情況。
3.連接時出現了LANG的錯誤,可能就是Sybase不識別系統使用的語言,我遇到的是由於多語言引起的。export應該可以了 。
4.另外還有一個方法可以快速查sybase有沒啟動服務。lsof -i:端口號。端口號可以在Sybase_HOME/interfaces可以查看端口號。
5.關閉服務可以通過Kill進程,或者通過isql以SA用戶登錄使用shutdown go來關閉數據庫
6.開啟數據庫,./startserver.sh -f RUN_服務名 -f RUN_備份服務名
some points in Sybase:
sybsystemprocs 系統過程數據庫
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刪除設備。
三、遇到連接錯誤的問題:當使用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
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台上打印的信息有時候是不完整。