2010年8月12日 星期四

SQL Server 增加欄位的至指定位置的錯覺

如果你以SQL Server Management Studio來編輯現有Table的欄位位置,感覺好像很方便,但說穿了,不過是玩了一招移花接木的招數而已。有圖為證:

原本Test 表只有一個a欄位,我用Studio修改該表,加入一個新欄位v並且放到a前面,然後按下左上角的「產生變更指令」後,就可看到上面的圖示;我把指令給「放大」如下:

/* 為了避免發生資料可能遺失的任何問題,您應該先詳細檢視此指令碼,然後才能在資料庫設計工具環境以外的位置執行。*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_test
(
v nchar(10) NULL,
a varchar(20) NULL
) ON [PRIMARY]
GO
IF EXISTS(SELECT * FROM dbo.test)
EXEC('INSERT INTO dbo.Tmp_test (a)
SELECT a FROM dbo.test WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.test
GO
EXECUTE sp_rename N'dbo.Tmp_test', N'test', 'OBJECT'
GO
COMMIT


就這樣,當你以為SQL 2005真的做了什麼了不起的事的時候,小心,說不定它也只是取巧而以。

2010年8月10日 星期二

遇見ORA-16014:Recovery空間不足的錯誤


早上一進辦公室就被同事追殺,劈頭就問測試區怎麼進不去,前端SQL開發工具又出現啥勞子「未存檔日誌...」之類的鬼訊息,從他們個個「殷切」關心的眼神來看,壓力很快就填滿整個心臟了。

好了,我試著用sqlplus 登入,並查詢目前$instance的狀態,發現是Mounted的狀態,那還不簡單?直接改成Open就好啦。可是直覺告訴這應該只是假象,事情沒那麼單純。等到一執行 alter database open之後,果不其然就出現了同事口中的鬼訊息了:

SQL> alter database open;
alter database open
*
ERROR 在行 1:
ORA-16014: 未存檔日誌 2 序號 171291, 沒有可用的目的地
ORA-00312: 線上日誌 2 繫線 1:
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\myDatabase\REDO02.LOG'

上網快速查了一下,原來是Recovery的空間不夠了,我開了220G的Recovery還不夠,難道是因為每天凌晨排程的Impdp關係造成的嗎?無時間多想,先在sqlplus將Recovery空間加大到250(alter system set db_recovery_file_dest_size = 250G),再到RMAN下了ARCHIVELOG ALL DELETE INPUT 騰出空間來,耐心等了10分鐘左右,再回到sqlplus再將資料改成Open狀態後,搞定!

至於Impdp為何會產生大量Archive log的問題,腦袋中閃過一些些殘存的影像(全面啟動?),等我印證後再來報告。

2010年8月9日 星期一

[SQLSTATE 42000] (錯誤 20036) 解法

如果你發現在「作業活動監視器」有個「清除逾期的訂閱」作業歷程老是告訴你無法執行成功,錯誤訊息又是[SQLSTATE 42000] (錯誤 20036)的話,你應該犯了跟我一樣的「錯」。這個錯誤來自散發者伺服器未將本身加入發行者的所造成的,看起來應該是個SQL2005的Bug。解決方式很簡單,把散發者加入發行者就可以了;步驟參考 這裡,我翻譯成中文如下:

  1. 在複寫節點按右鍵,選擇「散發者屬性」。
  2. 在左邊「選取頁面」選擇「發行者」。
  3. 在右邊選擇「加入」按鈕,並選擇「加入SQL Server發行者」。
  4. 提供散發者登入資訊即可。
  5. 回到「作業活動監視器」,按右鍵點選出錯的「清除逾期的訂閱」作業,選擇「從下列步驟作業」即可。

一開始假設我沒犯了潔癖的毛病,把預設加入發行者的散發者給移掉的話,這錯誤也不會困擾我好些陣子,真是無語。