顯示具有 DataBase 標籤的文章。 顯示所有文章
顯示具有 DataBase 標籤的文章。 顯示所有文章

2013年11月22日 星期五

同質資料庫跨版本升級或異質資料庫移轉

為什麼沒事會想來寫這樣一篇文章呢?主要是因為我在IT邦幫忙應發文者的要求貼了兩張圖,就是,結果居然被選為最佳解答,但事實上對發問的人來說,這個作法他若真的去作就會發現是不可行的,我心中有愧,後來就在討論告訴對他來說最適合的方法,並將我個人移轉資料庫的經驗提供大家。想說我也很久沒更新部落格了,就將我的資料庫移轉經驗分享給大家。

如果是我自己要作同質資料庫跨多個版本升級或甚至是異質資料庫移轉,我會這樣作:

1. 先用MS SQL的SSIS工具移轉所有的Table資料

2. 與原資料庫對照重新建立所有Table上的Index(包含PK)

(以下步驟3~5如果是同質資料庫升級應該Loading不大,就是在就資料庫產生Create指令再到新資料庫執行就好,但如果是異質資料庫移轉最好作好心理準備,除了Create View語法應該算標準ANSI SQL指令可能只要小改,其他的SP、Function應該都是要有重寫的打算)

3. 請程式設計師重建所有的Function


4. 請程式設計師重建所有的View


5. 請程式設計師重建所有的SP(stored procedure 預存程序)


(以上步驟3~5在執行時,有可能會有相依性的關係,Ex.在某個Function中可能會用到某個View或某個SP,遇到這種情形就要先建那個View或SP,這個順序是我的個人經驗,這樣作的相依性的問題應該會最少,但這取決於您應用系統程式設計師的習慣,反正這部份算他的工作可以由他決定)


6. 請程式設計師測試所有程式碼中和資料庫相關的地方(Connection建立/關閉、資料新增/修改/刪除/查詢、資料庫效能壓力測試[就是找之前系統慢的地方來測])


7. 以上步驟都OK了,請先選黃道吉日,公告周知系統維護將進行維護暫不開放,重作以上步驟1~6(先前的只是測試,請記得保留先前步驟3~6所有修改的成果)

2010年5月10日 星期一

MS SQL字串中的單引號要如何表示

今天協助同事處理SQL查詢速度太慢的問題,原來的語法是:
Select * from Table_A LeftJoin OpenQuery(Another_DB_Server,'Select * from DB.dbo.Table_B') as Table_B on
(Table_A.Col_1=Tbale_B.Col_1 AND
Table_B.Col_4='D')
Where Table_A.YYMM='201005'
其中Table_A資料筆數約15萬筆,Table_B資料筆數約20萬筆,這個查詢查下去要花56秒,我看了以後直覺就是兩個大Table Join不慢才有鬼,所以我第一件事就是先減少遠端查詢的資料筆數,也就是在OpenQuery那行SQL指令作手腳,原本是:
Select * from DB.dbo.Table_B
改成:
Select * from DB.dbo.Table_B Where Col_4='D'

可是問題來了,在OpenQuery中的這段SQL指令是一個字串,前後都要用單引號包著,快兩年沒用SQL了,字串中的單引號要如何表示早就忘了,找一本SQL指令的書看半天都找不到,只好拜Google大神,一下就找到答案了,就是用兩個單引號表示,將原本的SQL指令改為:
Select * from Table_A LeftJoin OpenQuery(Another_DB_Server,'Select * from DB.dbo.Table_B Where Col_4=''D''') as Table_B on
(Table_A.Col_1=Tbale_B.Col_1)

眼花了吼!
'Select * from DB.dbo.Table_B Where Col_4=''D'''
[單引號]Select * from DB.dbo.Table_B Where Col_4=[單引號][單引號]D[單引號][單引號][單引號]

2009年7月30日 星期四

SQL Server Dump交易記錄

換隨身記事本,把之前的小抄貼上來

dbcc checkdb(‘DbName’);

dump transaction DbName with no_log;

2008年12月4日 星期四

SQL Server 2005電腦名稱改變導致無法作複寫Replication(新增發行集時)

發生原因:最近要測試SQL Server 2005的複寫功能(發行與訂閱),以解決公司現行環境中有多台SQL Server間要排程作SSIS轉檔的問題,但是在當我要在發行端的主機上要作新增發行集的工作時,錯誤訊息出現了。

錯誤訊息:
SQL Server無法連接到伺服器'NewServerName'
其他資訊:
SQL Server 複寫需要有實際的伺服器名稱才能連接到伺服器。不支援透過伺服器別名、IP 位址或任何其他替代名稱來進行連接。請指定實際的伺服器名稱,'OldServerName'。 (Replication.Utilities)

問題追查:錯誤訊息中的'NewServerName'是現在這台主機的電腦名稱,'OldServerName'是我沒見過的電腦名稱,剛看到錯誤息時,我以為是我在hosts檔中設的主機名稱有誤,但是檢查過都沒錯呀!我印象中好像之前的同事有跟我問過要幫這裡SQL Server改主機名稱的事(我之前是待SI公司,後來公司倒了,我就輾轉轉到以前的客戶公司上班),經詢問後才知道,的確當初這台主機在灌完SQL Server後有改過電腦名稱。我下了以下SQL的指令確認:
Select @@ServerName
出來的結果確實是OldServerName


解決方法:我印象中SQL Server 2000要改電腦名稱的步驟是很複雜的,不然改完後SQL Server會無法啟動,SQL Server 2005我就不確定了,我想是不是以前的同事漏了那個步驟,導致現在的問題,所以就上微軟找KB囉!結果發現SQL Server 2005要改電腦名稱超簡單,3個步驟搞定:
1.直接先改電腦名稱,改完重開(其實重開完SQL Server就可以用了,當初前同事就只作到這)
2.下SQL指令  sp_DropServer OldServerName
3.一樣下SQL  sp_AddServer NewServerName,Local
搞定結案!

PS.寫這篇花的時間比我解決這個問題的時間還長耶!怎麼會這樣,打字太慢了嗎?

2008年5月29日 星期四

SQL 2000 如何關閉 xp_cmdshell

有個客戶最近他們公司網站被駭客入侵,懷疑駭客是用xp_cmdshell寫木馬到主機,發mail問我要如何關閉SQL 2000 的xp_cmdshell 指令。

 

這個FAQ的解答如下:
Use Master
Exec sp_dropextendedproc N'xp_cmdshell'

2008年3月2日 星期日

如何自動開啟Oracle資料庫

在Windows環境下只要設定服務:Oracle_SID的啟動類型為自動即可,在UNIX環境下則是修改/var/opt/ovacle/oratab,將SID那一行的N改為Y即可

Oracle OCP證書申請發證流程

今天收到一封e-mail,是去年一起上Oracle教育訓練課程的同學寄來的,原來他也考過OCP了,但不知道要怎樣才能拿到證書,去年我剛考過時也是搞不清楚,問了已經考過OCP的同事,他也只記得要上要去prometric網站上登錄,所以我就只好去拜Google大神,那時想說只會用這一次所以也沒有保留資料,所以剛剛又再幫同學找了一遍,還真不好找,既然會有人問,就把他記在我的bolg囉!

以下資料引用自:http://www.hxre.org/post/50.html

引用網址為: http://www.hxre.org/cmd.asp?act=tb&id=50&key=83854

============傳說中的分隔線=====================

如果您已经完成ORACLE一门原厂培训和顺利通过了OCP(042,043)考试后,请在7天后登录如下网址:
http://oracle.prometric.com,并按照如下步骤进行填写。
1) 如果您已经注册,请点击Secure Sign-in;如果未注册,请点击First-time Registration建立新帐户
(无论注册与否,请务必使用已有的Prometric ID,否则不能确保证书拿到);
2) 请填写用户名和密码,并点击“继续continue”
3) 选择“进行考试Take Test”
4) 在中间栏框“Private Tests”处,请9i考生输入“9icourse”,而10g考生输入“10gcourse”,并“提交submit”
5) 点击“take test”或“resume test”后,再点击“begin survey”,正式进入调查问卷一
6) 请按步骤逐一填写各项,请勿空项、漏项。请务必填清“registration ID”
7) 完成问卷一后,请填写您的建议或空项,点击“下一步”
8) 出现个人信息界面后,点击“继续”,开始进入调查问卷二
9) 点击“begin Test”,并回答问题,之后“结束问答End Test”
10)确认“结束考试”。请填写您的建议或空项,点击“下一步”
11)出现个人信息界面后,点击“继续”
12)确认无误后,“sign-out”退出
Oracle将以此调查问卷一和二做为发放证书的依据,一旦收到问卷,将尽快受理。
-------------------------------------------------------------
关于Hands On Course的填写提示及补救方法
Hands On Course 的填写注意点
1、链接www.oracle.prometric.com网址,填写Prometric ID and password 进入页面。第一次进入的话,
请进入Creat an Account进行密码等设置。
2、Keycodes for the Hands On Course Requirement. For example:
Oracle Datebase 10g Administrator Certified Professional------------10gcourse
Oracle Datebase 10g Administrator Certified Master------------------ocmcourses
Oracle 9i Datebase Administrator Certified Professional--------------9icourse
Oracle Application Server 10g Adiministrator: Certified Professional-------Available Soon
Oracle 9i Database Adiministrator Certified Master-------Available Soon
3、按要求完成选择题目。
其中有一题是需要填写你的Enrollment ID,即Registration Number。这个在考试结果上有写明。
4、在完成所有的选项后,确认无误,请选择提交。等待信息认证的确认结果。
------------------------------------------------------------------------------------------------
hands on (50-60天)后还没有收到证书,或者还有其他疑问,请拨打甲骨文大学的热线电话:800-810-9931转62548
--------------------------------------------------------------------------------------------------
Hands On Course 填写错误后的补救方式
1、如果在提交前就发现自己有地方填写错误,那么还好,请耐心等待30天。30天后请更正信息重新提交。
2、如果提交后发现自己填写错误,那么也还好,不是无法挽回的。就是比较麻烦:~
第一、请耐心等待7-30天,在此期间您将会收到Prometric与Oracle发出来的邮件;
第二、再收到邮件后,请更加耐心地写封邮件至:OCPREQ_ww@oracle.com(如果您参加的 是OCP的考试的话);
第三、邮件的Title为:9i/10g ocp certificate successful kits request;
第四、就是邮件的内容啦,必须包含个人信息+考试时间(最后一门考试结束的时间) +培训课程名称
+Enrollment ID+培训开始的时间+培训地点+培训机构
第五、发送邮件,继续等待。:Z
基本上就是这样一个步骤,如果还有什么问题,
也可以打甲骨文大学的热线电话“800-810-9931”去咨询啊!

2008年1月4日 星期五

Oracle Redo、Undo及Rollback Segment觀念

記得剛接觸Oracle時,只是把他當作應用程式儲存資料的地方,所以那時候和DBA溝通時,聽他們在講什麼Redo、Undo、Rollback Segment也是常常搞混,最近有朋友剛開始玩Oracle,環境中有7.x~10g都有,所以被搞的頭昏腦脹,只好打電話問我..我是這樣回答的:

Redo就是重作,當我們使用DML指令(Update、Delete、Insert)對資料進行修改後,Oracle會將我們對資料修改的操作及資料本身寫入Redo Log Buffer,Oracle會找適當的時機(*註1)將Redo Log Buffer內的東西寫入Redo Log Files,由於Redo Log Files是循環寫入的,所以在異動頻繁的狀態下會很快被蓋掉,如果想要將這些異動的記錄保留下來,就請開啟Oracle Archiving Mode,這樣Oracle作Log Switch時,就會將Redo Log Files內容另存一份成為Archive Log Files

Undo就是取消之前作的,8i以前(含8i)的Rollback Segment,在9i改叫Undo Segment;當我們進行交易時,Oracle會利用Undo Segment來存放異動前後的資料,在交易未Commit前,其他使用者可以在這裡查詢舊資料,如果交易失敗或取消,Oracle就可以很快的將由回復原先的資料,在9i提供了Flashback Query可以讓我們查詢交易Commit以前的資料(能查多久以前的資料?看Undo Tablespace有多大、UNDO_RETENTION設多少),到了10g,我們甚至可以回復已經Commit的交易(利用Flashback Query中的Undo SQL指令)。

註1.所謂適當時機就是:

  • 交易確認時
  • Redo Log Buffer的資料異動量放超過整個Buffer的1/3
  • Redo Log Buffer的資料異動量超過1MB
  • 當DBWR將異動的Data Block從Data Buffer Cache寫入Data Files之前

2007年10月25日 星期四

Oracle啟動Archiving Mode的步驟

1.關閉資料庫
shutdown immediate;

2.啟動資料庫至Mount狀態
startup mount;

3.設定資料庫為Archiving Mode
alter database archivelog;

4.開啟資料庫
alter database open;

5.最後建議作個完整備份

2007年10月9日 星期二

Oracle Connection的Timeout在.NET中要怎麼設??

目前結論是不能設!!不管您是用Oledb或OracleClient都不行!

最近在寫一個Web Service讓廠商叫用,後端資料庫是ORACLE,用Oledb的方式連到資料庫抓資料。

當初規格是開10秒內要回應,昨天下班前廠商說要測試資料庫連不上的情形,所以我就把DB關掉,但是廠商反映Web Service都會超過10秒才回應不符規格要求,我在ConnectionString的後面加上Connect Timeout=5,測試一下!

嗯!!DataAdapter.SelectCommand.Connection.ConnectionTime如願的被改為5了,DataAdapter.Fill()時也會丟出exception,ex.Message怪怪的,什麼叫"多重步驟 OLE DB 操作發生錯誤。請檢查每一個可用的 OLE DB 狀態值",看不太懂...應該沒問題吧!所以我就下班讓廠商慢慢測囉!

今天快中午,廠商又打電話來,說他測完了叫我可以開DB!...咦!我不是一早就開DB了,追蹤程式才發現是只要Connection.Open()就會出這個exception,拿掉連線字串中的Connect Timeout=5就沒問題!所以就改一下讓廠商繼續測其他項目!

Google一下錯誤訊息,在微軟找到答案http://support.microsoft.com/kb/269495/zh-tw 應該是文中所說的但 ADO 連線字串有問題,後來又查了一堆資料,也作了一堆的測試....最後在MSDN文件中找到確定沒解的答案http://msdn2.microsoft.com/en-us/library/system.data.oracleclient.oracleconnection(vs.71).aspx

Note Unlike the Connection object in the other .NET Framework data providers (SQL Server, OLE DB, and ODBC), OracleConnection does not support a ConnectionTimeout property. Setting a connection timeout using a property or in the connection string has no effect and value returned is always zero. OracleConnection also does not support a Database property or a ChangeDatabase method.

微軟這邊沒支援,我想只好再找看看Oracle有沒有什麼方法可以作限制,試了半天改sqlnet.ora的參數names.request_retries、names.initial_retry_timeout、SQLNET.INBOUND_CONNECT_TIMEOUT、SQLNET.RECV_TIMEOUT、SQLNET.RECV_TIMEOUT都試過了都沒效!

明天上班再試試吧....

============2008/03/06 補充=====

時光飛逝,其實隔天我在MSDN就找到解決的方法了,他是一個VB6的範例,印象中他是用Timer去作計時,不過我現在忘記是用什麼關鍵字去搜尋到的,所以沒有辦法附原始範例的連結囉....

既然我們用的是.Net,所以當然不要用Timer這種方式來作,我的解法是用.Net多執行緒的方式來解,範例如下:

Imports System.Data.OracleClient
Public Class frmOracleClient
    Dim StartTime, EndTime As DateTime
    Dim Cn As New OracleConnection

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim th As Threading.Thread
        th = New Threading.Thread(AddressOf CreateConnection)
        Try
            Dim i As Integer = 0
            th.Start()
            '判斷是否另一個執行緒是否執行完畢戓是超過5秒
            While th.ThreadState <> Threading.ThreadState.Stopped And i < 5  
            i = DateDiff(DateInterval.Second, StartTime, Now)
            End While
            If th.ThreadState = Threading.ThreadState.Running Then
                th.Abort()
            End If
        Catch ex As Exception

        End Try
        MessageBox.Show("Stop")

    End Sub

    Private Sub CreateConnection()
        Try
            Cn.ConnectionString = "Data Source=Your_DB_Name;User ID=Your_ID;Password=Your_Password"
            StartTime = Now
            Cn.Open()
        Catch ex As Exception
            EndTime = Now
            MessageBox.Show(ex.Message & vbCrLf & _
                        "StartTime : " & StartTime.ToString & vbCrLf & _
                        "EndTime : " & EndTime.ToString)
        End Try

    End Sub
End Class

2006年10月25日 星期三

查ORACLE使用者的表格佔多少磁碟空間

SELECT segment_name,segment_type,extents,bytes,
ROUND(bytes/(1024*1024),1) MBytes
FROM user_segments
ORDER BY segment_name

2005年4月18日 星期一

舊版(8i之前)ORACLE 預設的管理帳號及密碼

system/manager
sys/change_on_install
internal/oracle