201101201712[SQL] T-SQL 程式小片段 - 首部曲

  1. While 迴圈 與 insert 語法
  2. 建立資料庫、刪除資料庫 與 Partition Table
  3. 將某資料表資料倒入另一個資料表
  4. IF 判斷式 ELSE
  5. 備份(Backup)、還原(Restore)資料庫
  6. 備份裝置 backup device
  7. 備份資料庫驗證資料正確性
  8. 備份結尾 Tail Log
  9. 還原時指定(新)資料夾位置

 

While 迴圈 與 insert 語法

DECLARE @i int
set
@i=1
WHILE @i<1000
BEGIN
    INSERT INTO F1G3_TBL VALUES (@i) SET @i=@i+1
END

建立資料庫、刪除資料庫 與 Partition Table

-- 建立
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

  1. 建立檔案群組 FileGroup
  2. 建立對應的次資料檔案 (全部都放在 mdf 沒意義吧!)
  3. 建立 Partition Function (決定切割欄位與分割點)
  4. 建立 Partition Scheme (搭配 PF 決定指向哪些 FG)
  5. 建立資料表,並使用 ON 子句表示套用哪一個 PS
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

將某資料表資料倒入另一個資料表

插入資料
-- Insert into ... Select ... From
INSERT INTO dbo.New_Customers SELECT UserID, UserName FROM Customers

-- Select ... into ... From ...
SELECT * INTO New_Customers FROM Customers

PS:在 Recovery Mode 為 Bulk 時,這兩種操作方式,將不會產生 Transaction Log
PS2:Log 太大請參考 http://blog.xuite.net/tolarku/blog/41939197

  • DBCC SHRINKDATABASE (New_db,1)
  • DBCC SHRINKFILE (New_db,2)

 

IF 判斷式 ELSE

USE master
IF
  EXISTS (SELECT name FROM sys.databases WHERE name = N'NEW_db')
  BEGIN
    SELECT
'
資料庫已存在'
    
-- DROP DATABASE [New_db]
  END
ELSE
  BEGIN
    SELECT
'資料庫{}存在'
   
--CREATE DATABASE [New_db] -- 都不指定時會依系統 model DB 來建立,檔案會放在安裝SQL時所指定的資料路徑,沒改的話會在「C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA」
 
END
GO

備份(Backup)、還原(Restore)資料庫

-- 備份資料庫
BACKUP DATABASE NEW_db TO DISK ='C:\DBBackup\NEW_db.bak'
WITH INIT, STATS=25, COMPRESSION –-
使用壓縮


-- 還原資料庫

RESTORE DATABASE NEW_db
FROM  DISK = 'C:\DBBackup\NEW_db.bak'
WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 10

USE [master]
GO
EXEC
master.dbo.sp_addumpdevice  @devtype = N'disk', @logicalname = N'New_db', @physicalname = N'D:\DB\New_db.bak'

-- 也可以從SSMS來操作


-- 在選取備份目的地時就選[備份裝置]

-- 有什麼好處呢?

-- 你每次備份的時候,都必須給予不同的備份檔名稱,通常會以日期時間來做區隔,但是如果你每半小時做一次 Transaction Log Backup ,那意思就是說一天會有48個 Log 檔,你要救援還原時,就必須將那些 Log backup 一個一個倒回來,還得手動改檔案名稱~~麻煩阿
-- 使用
備份裝置時,你便可以輕鬆的點選你要還原的備份有哪些,勾一勾就搞定了



RESTORE DATABASE [Northwind] FROM  DISK = N'D:\DB\New_db.bak' WITH  FILE = 1,  NORECOVERY,  NOUNLOAD,  STATS = 10
GO
RESTORE
DATABASE [Northwind] FROM  DISK = N'D:\DB\New_db.bak' WITH  FILE = 2,  NORECOVERY,  NOUNLOAD,  STATS = 10
GO
RESTORE
LOG [Northwind] FROM  DISK = N'D:\DB\New_db.bak' WITH  FILE = 3,  NORECOVERY,  NOUNLOAD,  STATS = 10
GO
RESTORE
LOG [Northwind] FROM  DISK = N'D:\DB\New_db.bak' WITH  FILE = 4,  NOUNLOAD,  STATS = 10
GO


SELECT * FROM sys.backup_devices –- 備份裝置是屬於整體資料庫,非專屬於哪個使用者資料庫,可以用這行來查看目前有哪些

-- 單獨還原某一份 dump device 裡的 備份檔
RESTORE FILELISTONLY FROM new_db WITH FILE = 3

備份資料庫,驗證資料正確性(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 NORECOVERYFILE=1REPLACE

RESTORE
DATABASE Northwind FROM New_db
WITH FILE=2, NORECOVERY

……

RESTORE
 DATABASE Northwind FROM New_db
WITH FILE=19NORECOVERY

RESTORE
LOG Northwind FROM New_db
WITH FILE=20RECOVERY

本來想一篇寫完,哪知越串越多......還是得分幾部曲來寫

~ End

回應
Google Search
Google
平均分數:0 顆星
投票人數:0
我要評分:
Google