201101201712[SQL] T-SQL 程式小片段 - 首部曲
- While 迴圈 與 insert 語法
- 建立資料庫、刪除資料庫 與 Partition Table
- 將某資料表資料倒入另一個資料表
- IF 判斷式 ELSE
- 備份(Backup)、還原(Restore)資料庫
- 備份裝置 backup device
- 備份資料庫驗證資料正確性
- 備份結尾 Tail Log
- 還原時指定(新)資料夾位置
DECLARE @i int set @i=1 WHILE @i<1000 BEGIN INSERT INTO F1G3_TBL VALUES (@i) SET @i=@i+1 END |
-- 建立 CREATE DATABASE [New_db] ON PRIMARY ( NAME = N'New_db', FILENAME = N'C:\DB\New_db.mdf' , SIZE = 100MB , FILEGROWTH = 10MB ) LOG ON ( NAME = N'New_db_log', FILENAME = N'C:\DB\New_log.ldf' , SIZE = 25MB , FILEGROWTH = 10%) -- 刪除 DROP DATABASE New_db -- 修改 把建立的語法最前面 Create 改成 Alter 就可以 -- 指定使用哪個資料庫 USE New_db -- 建立檔案群組 ALTER DATABASE New_db ADD FILEGROUP fg1 -- 建立 次資料檔案 ndf 。因為主資料檔已經建立,所以這邊也是用 Alter 來新增 ALTER DATABASE New_db ADD FILE ( NAME = N'New_db2', FILENAME = 'C:\DB\New_db2.ndf', SIZE = 1MB, MAXSIZE = 100MB, FILEGROWTH = 1MB) TO FILEGROUP fg1 -- Partition Function 與 Partition Scheme 請參考 http://blog.xuite.net/tolarku/blog/31088968
CREATE TABLE dbo.New_table1
( ID int IDENTITY(1,1) NOT NULL, –- 遞增值 Username nvarchar(30) NOT NULL, –- 欄位屬性 nvarchar,大小30個 unicode,不允許 Null LogDate datetime NOT NULL DEFAULT (getdate()),–- 給 getdate()結果當預設值 status nchar(1) ) ON ps_1(LogDate) –- 指定使那用 Partition Scheme 並欄位 LogDate 以時間點來作分割 -- 觀看各 Partition 的筆數
SELECT partition_number '資料分割編號', rows '筆數' FROM sys.Partitions WHERE [object_id] = OBJECT_ID('dbo.New_Table1') -- 修改 Recovery Mode ALTER DATABASE NEW_db SET RECOVERY FULL |
插入資料 -- Select ... into ... From ...
|
USE master |
-- 備份資料庫 -- 有什麼好處呢? -- 單獨還原某一份 dump device 裡的 備份檔 |
備份資料庫,驗證資料正確性(Checksum)與備份有效性(Restore Verifyonly)
BACKUP DATABASE [Northwind] TO [New_db] WITH NOFORMAT, NOINIT, NAME = N'Northwind-完整資料庫備份', SKIP, NOREWIND, NOUNLOAD, STATS = 10, CHECKSUM GO declare @backupSetId as int select @backupSetId = position from msdb..backupset where database_name=N'Northwind' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'Northwind' ) if @backupSetId is null begin raiserror(N'確認失敗。找不到資料庫''Northwind'' 的備份資訊。', 16, 1) end RESTORE VERIFYONLY FROM [New_db] WITH FILE = @backupSetId, NOUNLOAD, NOREWIND GO |
備份結尾 Tail Log,在 SQL 2005 之後要還原資料庫之前都必須先備份 Tail Log,否則會發生錯誤
錯誤訊息: 訊息3159,層級16,狀態1,行1 資料庫"adm01" 的記錄結尾尚未備份。若您不想遺失其中的內容,請使用BACKUP LOG WITH NORECOVERY 備份記錄。亦可使用RESTORE 陳述式的WITH REPLACE 或WITH STOPAT 子句,覆寫記錄的內容。 訊息3013,層級16,狀態1,行1 RESTORE DATABASE 正在異常結束。 -- 備份記錄結尾 Tail log BACKUP LOG Northwind TO New_db WITH NO_TRUNCATE -- NO_TRUNCATE 表示在備份後不要把 Log 刪除掉 |
還原時指定(新)資料夾位置,Replace 是表示當如果有該資料庫存在則覆蓋他
RESTORE DATABASE Northwind FROM New_db WITH FILE = 1,REPLACE , MOVE 'Northwind ' TO 'X:\DB\Northwind.mdf', MOVE 'Northwind _log' TO 'X:\DB\Northwind_log.LDF' |
最後在強調一下
如果你的備份包含了 Full Backup、Differential Backup 跟 Transaction Log Backup,當你在做救援行動時,記得先還原最近的一份 Full Backup ,再還原最近一份的 Differential Backup ,然後依序還原在 Differential backup 時間之後的 Log Backup
前面的所有還原都必須帶上 WITH NORECOVERY,使其於 Restoring 狀態,一直到最後一個 Transaction Log Backup 在使用 WITH RECOVERY。
USE MASTER
GO
RESTORE DATABASE Northwind FROM New_db
WITH NORECOVERY, FILE=1, REPLACE
RESTORE DATABASE Northwind FROM New_db
WITH FILE=2, NORECOVERY
……
RESTORE DATABASE Northwind FROM New_db
WITH FILE=19, NORECOVERY
RESTORE LOG Northwind FROM New_db
WITH FILE=20, RECOVERY
本來想一篇寫完,哪知越串越多......還是得分幾部曲來寫
~ End