PIXNET Logo登入

互聯網 - 大數據

跳到主文

本部落格為互聯網熱門頭條訊息管理中心

部落格全站分類:生活綜合

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 3月 09 週四 201720:38
  • 數據庫的讀讀事務也會產生死鎖


文章出處
數據庫的讀讀事務也會產生死鎖
 
前段時間有朋友問:SQL Server的AlwaysOn的輔助數據庫默認會使用行版本快照控制來消除數據庫上的讀寫事務阻塞和死鎖問題
即使用戶顯式為查詢設置了其他事務隔離級別,所有鎖提示(Lock Hint)都會被忽略。
為了保證數據同步的完整性,AlwaysOn規定來自數據同步(redo 日志)所做的寫操作永遠不會被選為死鎖犧牲品,無論該寫操作的代價多小。
 
AlwaysOn的做法其實很好理解,數據庫中的事務操作無非就四種
1、讀讀 
2、讀寫
3、寫讀
4、寫寫
 
 
第二種、第三種和第四種造成阻塞和死鎖很容易理解,讀事務得到的鎖資源不釋放就有可能造成寫事務失敗或者寫事務得到的鎖資源不釋放就有可能造成讀事務
但是第一種讀讀事務也會造成死鎖嗎?
 
我這里做一個實驗
1、先確保數據庫沒有使用任何快照隔離級別
USE [tt1]
DBCC USEROPTIONS

 
 
2、腳本1
USE [tt1];
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
SELECT * FROM [dbo].[Table_1] WITH (ROWLOCK) WHERE [q]=88

 
 
3、腳本2
USE [tt1];
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
SELECT * FROM [dbo].[Storage] WITH (TABLOCKX)
SELECT * FROM [dbo].[Table_1] WHERE [q]=7

 
 
4、腳本3
USE [tt1];
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
SELECT * FROM [dbo].[Table_1] WITH (ROWLOCK) WHERE [q]=88

 
 
5、腳本4
USE [tt1];
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
SELECT * FROM [dbo].[Table_1] WITH (ROWLOCK)

 
 
6、在多個查詢窗口(session)里執行上面的腳本
 
 
7、打開跟蹤標記
 DBCC TRACEON (1204, 1222, -1);
DBCC tracestatus

 
 
8、過一會兒就會看到其中一個session 59已經作為死鎖犧牲品
 
9、在errorlog里已經看到spid為4的死鎖監視器(LOCK MONITOR)已經監測到死鎖的存在
EXEC xp_readerrorlog 0,1,NULL,NULL,'2015-08-06','2015-10-10','DESC'

 


總結
多人都不了解為什么SELECT語句也會產生死鎖,其實SELECT語句一般在RC隔離級別下很少會發送死鎖,只是用戶在日常開發中會使用了一些不恰當的鎖提示(Lock Hint)或者提升了事務隔離級別而導致
日常開發中我們都要注意不要濫用鎖提示(Lock Hint),根據實際情況進行判斷,該提升事務隔離級別就提升事務隔離級別,以免造成不必要的死鎖。
 
 
如有不對的地方,歡迎大家拍磚o(∩_∩)o 
(繼續閱讀...)
文章標籤

AutoPoster 發表在 痞客邦 留言(0) 人氣(5)

  • 個人分類:生活學習
▲top
  • 3月 09 週四 201720:38
  • Sequence Project Showplan Operator 序列映射運算符

文章出處
Sequence Project Showplan Operator 序列映射運算符
 
序列映射運算符會從一個已經排序的集合里通過不停添加集合里的列執行計算。
運算符根據一個或多個列的值把輸入集合分為多個片段。然后運算符一次輸出一個片段。
這些列在序列映射運算符里會被顯示為參數。
SQL Server支持四種類型函數:RANK, DENSE_RANK, ROW_NUMBER, NTILE
序列映射會生成有(一個序列映射)和(兩個片段)的執行計劃
 
The Sequence Project operator adds columns to perform computations over an ordered set. It divides the input set into segments based on the value of one or more columns. The operator then outputs one segment at a time. These columns are shown as arguments in the Sequence Project operator.
Microsoft SQL Server supports four types of functions: RANK, DENSE_RANK, ROW_NUMBER, and NTILE. Sequence Projectwill generate plans that have a Sequence Project and generally two segments.
Sequence Project is a physical and a logical operator.
 

 
https://msdn.microsoft.com/en-us/library/ms187041(v=sql.105).aspx
 
(繼續閱讀...)
文章標籤

AutoPoster 發表在 痞客邦 留言(0) 人氣(19)

  • 個人分類:生活學習
▲top
  • 3月 09 週四 201720:38
  • SQL Server通過File Header Page來進行Crash Recovery


文章出處
SQL Server通過File Header Page來進行Crash Recovery
看了蓋總的一篇文章
http://www.eygle.com/archives/2008/11/oracle_internals_preface.html

數據文件的第一個Block記錄了重要的檢查點、SCN等信息,這些信息在啟動時要被讀取,這里就是這樣一種體現。


 
我們看一下SQL Server的情況,使用DBCC fileheader命令來讀取file header page,編號為10是我的一個用戶庫SSS的數據庫ID
環境:SQL Server2012 64位
SELECT DB_ID('sss')
DBCC fileheader(10)

(圖一)
(圖二)
(圖三)
 
(圖四)
 
從上面的圖大家應該發現一些規律
RecoveryForkLSN:Cash Recovery的時候需要調用的lsn,也是RedoStartLSN:27000000027100001
ReadOnlyLsn:只讀模式數據庫
ReadWriteLsn:讀寫模式數據庫
 
因為file header page是每個數據庫的mdf文件的第一個頁面,啟動的過程里面其實最重要也是最耗時就是數據庫redo和undo過程
所以把Redo Start LSN放在file header page也就不無道理了,數據庫一啟動馬上就讀取LSN信息,然后到LDF文件里讀取日志
 
數據庫第0頁:file header page
數據庫第1頁:PFS (Page Free Space) ,也叫頁面自由空間
數據庫第2頁:GAM 全局分配映射(Global Allocation Map,GAM)頁面 
數據庫第3頁:SGAM 共享全局分配映射(Shared Global Allocation Map,SGAM)頁面 
第4頁沒有數據
第5頁沒有數據
數據庫第6頁:DCM 差異變更(Differential Changed Map,DCM)頁面
數據庫第7頁:BCM 批量更改映射(Bulk Changed Map)頁面
數據庫第8頁:sys.sysqnames 存在于每個數據庫中。
數據庫第9頁:boot page 數據庫根據這個頁面的信息來啟動的
 
boot page是放在第9頁不是放在第0頁,為什麼呢?因為數據庫先要進行Cash Recovery才能啟動啊
 
--看一下file header page
DBCC TRACEON(3604,-1)
GO
DBCC PAGE([sss],1,0,3)
GO

DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。
PAGE: (
1:0)
BUFFER:
BUF
@0x00000002FDABA800
bpage
= 0x00000002EFF88000 bhash = 0x0000000000000000 bpageno = (1:0)
bdbid
= 10 breferences = 0 bcputicks = 88
bsampleCount
= 1 bUse1 = 36811 bstat = 0x9
blog
= 0x15ab215a bnext = 0x0000000000000000
PAGE HEADER:
Page
@0x00000002EFF88000
m_pageId
= (1:0) m_headerVersion = 1 m_type = 15
m_typeFlagBits
= 0x0 m_level = 0 m_flagBits = 0x208
m_objId (AllocUnitId.idObj)
= 99 m_indexId (AllocUnitId.idInd) = 0 Metadata: AllocUnitId = 6488064
Metadata: PartitionId
= 0 Metadata: IndexId = 0 Metadata: ObjectId = 99
m_prevPage
= (0:0) m_nextPage = (0:0) pminlen = 0
m_slotCnt
= 1 m_freeCnt = 7029 m_freeData = 7551
m_reservedCnt
= 0 m_lsn = (878:901:1) m_xactReserved = 0
m_xdesId
= (0:0) m_ghostRecCnt = 0 m_tornBits = -582568961
DB Frag ID
= 1
Allocation Status
GAM (
1:2) = ALLOCATED SGAM (1:3) = NOT ALLOCATED PFS (1:1) = 0x44 ALLOCATED 100_PCT_FULL
DIFF (
1:6) = CHANGED ML (1:7) = NOT MIN_LOGGED
File Header Data:
Record Type
= PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS
Record Size
= 1065
Memory
Dump @0x000000000D1BB956
0000000000000000: 30000800 00000000 31000000 00000000 002e007f 0.......1...........
0000000000000014: 007f0081 00830087 008b008f 0093009d 00a700b1 ....................
0000000000000028: 00b100b5 00b900bd 00c100cb 00e700f1 00fb0005 ....................
000000000000003C: 0115011f 012f0133 013d013d
01430153 01530153 ...../.3.=.=.C.S.S.S
0000000000000050: 01530153 01530153 01630163 0163016d 01770193 .S.S.S.S.c.c.c.m.w..
0000000000000064: 019d01ad 01c901d1 012904c5 cbddcf11 44c34889 .........)......D.H.
0000000000000078: 52cc552b 3eba7601 00010080 c00500ff ffffff80 R.U+>.v.............
000000000000008C:
00000000 00000000 00000000 00000000 00000000 ....................
00000000000000A0:
00000000 00000000 00000000 00000000 00800100 ....................
00000000000000B4:
00000000 00ffffff ff000200 001b0000 000f0100 ....................
00000000000000C8: 0001001b 0000000f
01000001 00000053 d02a7787 ...............S.*w.
00000000000000DC: 3ec94e97 926f64fe 3febf81b 000000c3 000000b2
>.N..od.?...........
00000000000000F0:
00000000 00000000 0000006e 0300006d 0300002e ...........n...m....
0000000000000104: 00284a9c 892994c1 4692f4f1 e3c51d34 90000000 .(J..)..F......4....
0000000000000118: 00000000 00000014 51b676d9 b1a34abc c0185ae9 ........Q.v...J...Z.
000000000000012C: 6fccb108 0000001b 0000000f
01000001 00730073 o................s.s
0000000000000140: 0073006a 49d8681b 194f469a 40c068d8 57651953 .s.jI.h..OF.@.h.We.S
0000000000000154: d02a7787 3ec94e97 926f64fe 3febf800 00000000 .*w.>.N..od.?.......
0000000000000168: 00000000 00000000 00000000 00000000 00000000 ....................
000000000000017C:
00000000 00000000 00000000 00000000 00000000 ....................
0000000000000190: 0000001b 000000c3 000000b2 006a49d8 681b194f .............jI.h..O
00000000000001A4: 469a40c0 68d85765
19000000 00000000 00000000 F.@.h.We............
00000000000001B8:
00000000 00000000 00000000 00000000 00000000 ....................
00000000000001CC:
00000000 00000000 00000000 00000000 00000000 ....................
00000000000001E0:
00000000 00000000 00000000 00000000 00000000 ....................
00000000000001F4:
00000000 00000000 00000000 00000000 00000000 ....................
0000000000000208: 00000000 00000000 00000000 00000000 00000000 ....................
000000000000021C:
00000000 00000000 00000000 00000000 00000000 ....................
0000000000000230: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000244: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000258: 00000000 00000000 00000000 00000000 00000000 ....................
000000000000026C:
00000000 00000000 00000000 00000000 00000000 ....................
0000000000000280: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000294: 00000000 00000000 00000000 00000000 00000000 ....................
00000000000002A8:
00000000 00000000 00000000 00000000 00000000 ....................
00000000000002BC:
00000000 00000000 00000000 00000000 00000000 ....................
00000000000002D0:
00000000 00000000 00000000 00000000 00000000 ....................
00000000000002E4:
00000000 00000000 00000000 00000000 00000000 ....................
00000000000002F8:
00000000 00000000 00000000 00000000 00000000 ....................
000000000000030C:
00000000 00000000 00000000 00000000 00000000 ....................
0000000000000320: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000334: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000348: 00000000 00000000 00000000 00000000 00000000 ....................
000000000000035C:
00000000 00000000 00000000 00000000 00000000 ....................
0000000000000370: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000384: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000398: 00000000 00000000 00000000 00000000 00000000 ....................
00000000000003AC:
00000000 00000000 00000000 00000000 00000000 ....................
00000000000003C0:
00000000 00000000 00000000 00000000 00000000 ....................
00000000000003D4:
00000000 00000000 00000000 00000000 00000000 ....................
00000000000003E8:
00000000 00000000 00000000 00000000 00000000 ....................
00000000000003FC:
00000000 00000000 00000000 00000000 00000000 ....................
0000000000000410: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000424: 00000000 00 .....
BindingID
= cfddcbc5-4411-48c3-8952-cc552b3eba76 FileIdProp = 1
FileGroupId
= 1 Size = 49280 MaxSize = 65535
Growth
= 128 Perf = 0 BackupLsn = (0:0:0)
FirstUpdateLsn
= (0:0:0) OldestRestoredLsn = (0:0:0) FirstNonloggedUpdateLsn = [NULL]
MinSize
= 384 Status = 0 UserShrinkSize = 65535
SectorSize
= 512 MaxLsn = (27:271:1) FirstLsn = (27:195:178)
CreateLsn
= (0:0:0) DifferentialBaseLsn = (878:877:46)
DifferentialBaseGuid
= 899c4a28-9429-46c1-92f4-f1e3c51d3490 FileOfflineLsn = (0:0:0)
FileIdGuid
= 76b65114-b1d9-4aa3-bcc0-185ae96fccb1 RestoreStatus = 8
RestoreRedoStartLsn
= (27:271:1) RestoreSourceGuid = 68d8496a-191b-464f-9a40-c068d8576519
HardenedSkipLsn
= [NULL] ReplTxfTruncationLsn = [NULL] TxfBackupLsn = [NULL]
FstrContainerSize
= [NULL] MaxLsnBranchId = 772ad053-3e87-4ec9-9792-6f64fe3febf8
SecondaryRedoStartLsn
= [NULL] SecondaryDifferentialBaseLsn = [NULL]
ReadOnlyLsn
= (0:0:0) ReadWriteLsn = (0:0:0)
RestoreDifferentialBaseLsn
= (27:195:178)
RestoreDifferentialBaseGuid
= 68d8496a-191b-464f-9a40-c068d8576519
RestorePathOrigin
hex (
dec) = 0x00000000:00000000:0000 (0:0:0)
m_guid
= 00000000-0000-0000-0000-000000000000
DatabaseEncryptionFileState.m_maxScannedPage
= 0 DatabaseEncryptionFileState.m_keyId = 0
FCBFileDEK
m_dbeStatusBits
= 0 m_dtCreated = 1900-01-01 00:00:00.000
m_dtLastRegenerated
= 1900-01-01 00:00:00.000
m_dtLastModified
= 1900-01-01 00:00:00.000 m_dtLastSet = 1900-01-01 00:00:00.000
m_dtOpened
= 1900-01-01 00:00:00.000m_algId = 0 m_algId = 0
m_dwBitLen
= 0 m_cbThumbprint = 0 m_rgbThumbprint = 0x
DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。

 
--看一下boot page的內容
DBCC TRACEON(3604,-1)
GO
DBCC PAGE([sss],1,9,3)
GO

Page @0x00000002EA7DE000
m_pageId
= (1:9) m_headerVersion = 1 m_type = 13
m_typeFlagBits
= 0x0 m_level = 0 m_flagBits = 0x200
m_objId (AllocUnitId.idObj)
= 99 m_indexId (AllocUnitId.idInd) = 0 Metadata: AllocUnitId = 6488064
Metadata: PartitionId
= 0 Metadata: IndexId = 0 Metadata: ObjectId = 99
m_prevPage
= (0:0) m_nextPage = (0:0) pminlen = 0
m_slotCnt
= 1 m_freeCnt = 6590 m_freeData = 1600
m_reservedCnt
= 0 m_lsn = (878:1345:2) m_xactReserved = 0
m_xdesId
= (0:0) m_ghostRecCnt = 0 m_tornBits = 2000067799
DB Frag ID
= 1
Allocation Status
GAM (
1:2) = ALLOCATED SGAM (1:3) = NOT ALLOCATED
PFS (
1:1) = 0x64 MIXED_EXT ALLOCATED 100_PCT_FULL DIFF (1:6) = CHANGED
ML (
1:7) = NOT MIN_LOGGED
Slot
0, Offset 0x60, Length 1504, DumpStyle BYTE
Record Type
= PRIMARY_RECORD Record Attributes = Record Size = 1504
Memory
Dump @0x000000000D1BA060
0000000000000000: 0000e005 c2026302 00000000 00000000 00000000 ......c.............
0000000000000014: 00000000 00000000 00000000 00000000 08008100 ....................
0000000000000028: ae80847c bba19900 0ca30000 73007300 73002020 ...|........s.s.s.
000000000000003C:
20202020 20202020 20202020 20202020 20202020
0000000000000050: 20202020 20202020 20202020 20202020 20202020
0000000000000064: 20202020 20202020 20202020 20202020 20202020
0000000000000078: 20202020 20202020 20202020 20202020 20202020
000000000000008C:
20202020 20202020 20202020 20202020 20202020
00000000000000A0:
20202020 20202020 20202020 20202020 20202020
00000000000000B4:
20202020 20202020 20202020 20202020 20202020
00000000000000C8:
20202020 20202020 20202020 20202020 20202020
00000000000000DC:
20202020 20202020 20202020 20202020 20202020
00000000000000F0:
20202020 20202020 20202020 20202020 20202020
0000000000000104: 20202020 20202020 20202020 20202020 20202020
0000000000000118: 20202020 20202020 20202020 20202020 20202020
000000000000012C:
20202020 20202020 06000000 0a006e00 70170000 ......n.p...
0000000000000140: 00000000 00000000 00000000 00000000 6e030000 ................n...
0000000000000154: 6d030000 2e004000 6e030000 3a050000 0c000200 m.....@.n...:.......
0000000000000168: 00000000 00000000 00000000 6e030000 3a050000 ............n...:...
000000000000017C: 0c000000 c2271400
00000000 24d00000 00000000 .....'......$.......
0000000000000190: 00000041 00000000 53d02a77 873ec94e 97926f64 ...A....S.*w.>.N..od
00000000000001A4: fe3febf8 00e67dbf 00000000 00000000 00000000 .?....}.............
00000000000001B8: 00000000 1b000000 0f010000 01000000 d305e86e ...................n
00000000000001CC: 6e28d54a 892e8070 c5aec1fa 1b000000 0f010000 n(.J...p............
00000000000001E0: 01000000 53d02a77 873ec94e 97926f64 fe3febf8 ....S.*w.>.N..od.?..
00000000000001F4: 284a9c89 2994c146 92f4f1e3 c51d3490 14000000 (J..)..F......4.....
0000000000000208: 01006302 00000000 00000000 00000000 22000000 ..c............."...
000000000000021C: d0000000 03000400 80000000 00000000 00000000 ....................
0000000000000230: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000244: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000258: 00000000 00000000 00000000 00000000 00000000 ....................
000000000000026C: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000280: c9020000 1e000000 e3000000 c3f9a100 bda30000 ....................
0000000000000294: 00000000 00000000 00000000 00000000 553cda00 ................U<..
00000000000002A8: 05a30000 b80b000b 00000000 59123e95 5d4a114b ............Y.>.]J.K
00000000000002BC: b9a2abb7 5245120c 00000000 00000000 00000000 ....RE..............
00000000000002D0: 00000000 00000000 00000000 00000000 96010000 ....................
00000000000002E4: 00010000 00000000 00000000 00000000 02000000 ....................
00000000000002F8: 00000000 00000000 00000000 00000000 00000000 ....................
000000000000030C: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000320: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000334: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000348: 00000000 00000000 00000000 00000000 00000000 ....................
000000000000035C: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000370: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000384: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000398: 00000000 00000000 00000000 00000000 00000000 ....................
00000000000003AC: 00000000 00000000 00000000 00000000 00000000 ....................
00000000000003C0: 00000000 00000000 00000000 00000000 00000000 ....................
00000000000003D4: 00000000 00000000 00000000 00000000 00000000 ....................
00000000000003E8: 00000000 00000000 00000000 00000000 00000000 ....................
00000000000003FC: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000410: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000424: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000438: 00000000 00000000 00000000 00000000 00000000 ....................
000000000000044C: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000460: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000474: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000488: 00000000 00000000 00000000 00000000 00000000 ....................
000000000000049C: 00000000 00000000 00000000 00000000 00000000 ....................
00000000000004B0: 00000000 00000000 00000000 00000000 00000000 ....................
00000000000004C4: 00000000 00000000 00000000 00000000 00000000 ....................
00000000000004D8: 00000000 00000000 00000000 00000000 00000000 ....................
00000000000004EC: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000500: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000514: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000528: 00000000 00000000 00000000 00000000 00000000 ....................
000000000000053C: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000550: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000564: 00000000 00000000 00000000 00000000 00000000 ....................
0000000000000578: 00000000 00000000 00000000 00000000 00000000 ....................
000000000000058C: 00000000 00000000 00000000 00000000 00000000 ....................
00000000000005A0: 00000000 00000000 00000000 20000000 78000000 ............ ...x...
00000000000005B4: 43000000 00000000 00000000 00000000 00000000 C...................
00000000000005C8: 00000000 00000000 00000000 00000000 00000000 ....................
00000000000005DC: 00000000 ....
DBINFO @0x000000000D1BA060
dbi_version = 706 dbi_createVersion = 611 dbi_SEVersion = 0
dbi_dvSplitPoint = 0:0:0 (0x00000000:00000000:0000)
dbi_dbbackupLSN = 0:0:0 (0x00000000:00000000:0000)
dbi_LastLogBackupTime = 1900-01-01 00:00:00.000
dbi_nextseqnum = 1900-01-01 00:00:00.000 dbi_status = 0x00810008
dbi_crdate = 2014-04-13 09:19:21.370dbi_dbname = sss dbi_dbid = 10
dbi_cmptlevel = 110 dbi_masterfixups = 0 dbi_maxDbTimestamp = 6000
dbi_dbbackupLSN = 0:0:0 (0x00000000:00000000:0000) dbi_RebuildLogs = 0
dbi_differentialBaseLSN = 878:877:46 (0x0000036e:0000036d:002e) dbi_RestoreFlags = 0x0040
dbi_checkptLSN = 878:1338:12 (0x0000036e:0000053a:000c) dbi_dbccFlags = 2
dbi_COWLastLSN = 0:0:0 (0x00000000:00000000:0000)
dbi_DirtyPageLSN = 878:1338:12 (0x0000036e:0000053a:000c) dbi_RecoveryFlags = 0x00000000
dbi_lastxact = 0x1427c2 dbi_collation = 53284 dbi_relstat = 0x41000000
dbi_familyGUID = 772ad053-3e87-4ec9-9792-6f64fe3febf8 dbi_maxLogSpaceUsed = 3212699136
dbi_recoveryForkNameStack
entry 0
hex (dec) = 0x0000001b:0000010f:0001 (27:271:1)
m_guid = 6ee805d3-286e-4ad5-892e-8070c5aec1fa
entry 1
hex (dec) = 0x0000001b:0000010f:0001 (27:271:1)
m_guid = 772ad053-3e87-4ec9-9792-6f64fe3febf8
dbi_differentialBaseGuid = 899c4a28-9429-46c1-92f4-f1e3c51d3490 dbi_firstSysIndexes = 0001:00000014
dbi_oldestBackupXactLSN = 0:0:0 (0x00000000:00000000:0000)
dbi_versionChangeLSN = 34:208:3 (0x00000022:000000d0:0003) dbi_mdUpgStat = 0x0004
dbi_category = 0x0000000000000080 dbi_safetySequence = 0
dbi_dbMirrorId = 00000000-0000-0000-0000-000000000000
dbi_pageUndoLsn = 0:0:0 (0x00000000:00000000:0000) dbi_pageUndoState = 0
dbi_disabledSequence = 0 dbi_dbmRedoLsn = 0:0:0 (0x00000000:00000000:0000)
dbi_dbmOldestXactLsn = 0:0:0 (0x00000000:00000000:0000) dbi_CloneCpuCount = 0
dbi_CloneMemorySize = 0 dbi_updSysCatalog = 1900-01-01 00:00:00.000
dbi_LogBackupChainOrigin = 713:30:227 (0x000002c9:0000001e:00e3)
dbi_dbccLastKnownGood = 2014-10-07 09:49:44.117 dbi_roleSequence = 0
dbi_dbmHardenedLsn = 0:0:0 (0x00000000:00000000:0000) dbi_localState = 0
dbi_safety = 0 dbi_modDate = 2014-04-06 13:14:34.310
dbi_verRDB = 184552376 dbi_lazyCommitOption = 0
dbi_svcBrokerGUID = 953e1259-4a5d-4b11-b9a2-abb75245120c dbi_svcBrokerOptions = 0x00000000
dbi_dbmLogZeroOutstanding = 0 dbi_dbmLastGoodRoleSequence = 0 dbi_dbmRedoQueue = 0
dbi_dbmRedoQueueType = 0 dbi_rmidRegistryValueDeleted = 0 dbi_dbmConnectionTimeout = 0
dbi_fragmentId = 0 dbi_AuIdNext = 1099511628182
dbi_MinSkipLsn = 0:0:0 (0x00000000:00000000:0000) dbi_commitTsOfcheckptLSN = 2
dbi_dbEmptyVersionState = 0 dbi_CurrentGeneration = 0
dbi_EncryptionHistory
Scan 0
hex (dec) = 0x00000000:00000000:0000 (0:0:0)
EncryptionScanInfo:ScanId = 0
Scan 1
hex (dec) = 0x00000000:00000000:0000 (0:0:0)
EncryptionScanInfo:ScanId = 0
Scan 2
hex (dec) = 0x00000000:00000000:0000 (0:0:0)
EncryptionScanInfo:ScanId = 0
dbi_latestVersioningUpgradeLSN = 32:120:67 (0x00000020:00000078:0043) dbi_splitAGE = 0
dbi_PendingRestoreOutcomesId = 00000000-0000-0000-0000-000000000000 dbi_ContianmentState = 0

 
 
相關文章
查看SQLSERVER內部數據頁面的小插件Internals Viewer
 
 
如有不對的地方,歡迎大家拍磚o(∩_∩)o 
(繼續閱讀...)
文章標籤

AutoPoster 發表在 痞客邦 留言(0) 人氣(19)

  • 個人分類:生活學習
▲top
  • 3月 09 週四 201720:38
  • SQL Server差異備份的備份/還原原理

文章出處
SQL Server差異備份的備份/還原原理
記住一點:差異備份是基于最后一次完整備份的差異,而不是基于最后一次差異的差異
 
備份過程:
1-完整備份之后有無對數據庫做過修改,如果有,記錄數據庫的最后LSN(Last LSN)
如果完整備份之后無對數據庫做過修改,那么差異備份就沒有意義了
 
2-做差異備份時根據差異位圖讀取差異頁面內容
注意:差異位圖記錄了自從最后一次完整備份以來數據庫中有變化的頁面,這樣在做差異備份時候就不用掃全庫頁面,只需要讀取有差異的頁面
 
3-在備份之前,數據庫會做一次檢查點,備份時把最后一次檢查點的LSN記錄進去備份文件
4-把最后LSN也記錄進去備份文件
 
5-這時候數據庫的BOOTPAGE存放了數據庫最后一次完整備份的Checkpoint LSN
 
這時候備份文件里會存放幾個LSN值

FirstLSN
LastLSN
CheckpointLSN
DatabaseBackupLSN
DifferentialBaseLSN


 


BOOTPAGE里只有DifferentialBaseLSN有值


 


 


總體來說,差異備份文件里會存放


(1)下面的LSN值


FirstLSN
LastLSN
CheckpointLSN
DatabaseBackupLSN
DifferentialBaseLSN


 


(2)活動日志


 


(3)差異頁面



 



還原過程:

DifferentialBaseLSN作用:要還原差異備份先要還原一個完整備份,使用NORECOVERY選項,再還原差異備份,當還原差異備份的時候,數據庫根據差異備份文件里的DifferentialBaseLSN的值跟


數據庫BOOTPAGE保存的DifferentialBaseLSN的值進行比較,如果對不上,那么這個差異備份不能還原,另外一個是作為差異備份還原的基準LSN,差異備份文件里的CheckpointLSN如果小于DifferentialBaseLSN


那么也是沒有必要還原


 


1-將頁面從差異備份文件里讀出來,然后讀出頁頭的LSN號,跟差異備份文件里的CheckpointLSN進行比較,如果大于CheckpointLSN 并小于LastLSN,那么拿出差異備份文件里的活動日志對改頁面進行redo和undo
如果小于CheckpointLSN ,那么這個頁面不需要還原,因為數據庫里面的頁面版本比差異備份文件里的頁面還要新
活動日志里的日志記錄也保存了頁面編號,對于頁面的redo和undo是比較方便的
2-把redo和undo完畢的頁面寫回數據庫
差異備份的缺點
差異備份基于最后一次完整備份的差異,那么,對于一個繁忙的數據庫,在一段時間內做了幾次差異備份,無論這中間有多少次Checkpoint,SQL Server依然將這些
基于完整備份的差異頁面放入差異備份文件,按道理來說,一個頁面在一次Checkpoint之后,如果沒有再發生任何修改,那么是不需要放入差異備份文件里面的(如果是基于最后一次差異的差異)
因為差異位圖無法基于差異的差異,這樣會導致,有時候差異備份文件比完整備份文件還要大
 
 

--腳本
SELECT DB_ID('sss')
DBCC fileheader(16)
BACKUP DATABASE [sss] TO DISK='c:\sss_full.bak'
RESTORE FILELISTONLY FROM DISK ='c:\sss_full.bak'
RESTORE HEADERONLY FROM DISK ='c:\sss_full.bak'
1585000000012200042 --backuplsn
1686000000056400078 --ckpt lsn
1686000000060800001 --last lsn
CREATE TABLE tessssss(id INT)
go
INSERT tessssss SELECT 1 UNION ALL SELECT 2
BACKUP DATABASE [sss] TO DISK='c:\sss_diff.bak' WITH Differential
RESTORE HEADERONLY FROM DISK ='c:\sss_diff.bak'
1686000000056400078 --backuplsn
1686000000056400078 --diff lsn
1686000000065400151 --ckpt lsn
1686000000071800001 --last lsn
INSERT tessssss SELECT 3 UNION ALL SELECT 4
BACKUP DATABASE [sss] TO DISK='c:\sss_diff2.bak' WITH Differential
RESTORE HEADERONLY FROM DISK ='c:\sss_diff2.bak'
1686000000056400078 --backuplsn
1686000000056400078 --diff lsn
1686000000071900004 --ckpt lsn
1686000000072300001 --last lsn
--FirstLSN
--
LastLSN
--
CheckpointLSN
--
DatabaseBackupLSN
--
DifferentialBaseLSN


 


 
 
MySQL的xtrabackup備份工具的原理其實也是差不多,讀取頁面,根據CheckpointLSN和頁面的LSN比較進行備份和還原
所以LSN在數據庫的備份還原里面起著重要作用
 
 
對于最后一個LSN可以參考:

您真的理解了SQLSERVER的日志鏈了嗎?
http://www.cnblogs.com/lyhabc/p/3460272.html


 
如有不對的地方,歡迎大家拍磚o(∩_∩)o 
(繼續閱讀...)
文章標籤

AutoPoster 發表在 痞客邦 留言(0) 人氣(1,324)

  • 個人分類:生活學習
▲top
  • 3月 09 週四 201720:37
  • SQL Server 2016 CTP2.3 的關鍵特性


文章出處
SQL Server 2016 CTP2.3 的關鍵特性
 
數據庫方面的增強
Row Level Security已經支持In-memory OLTP 表。用戶現在可以對內存優化表實施row-level security策略。
另外SCHEMABINDING、predicate 函數和內聯表值函數都要包含NATIVE_COMPILATION編譯選項。
使用NATIVE_COMPILATION編譯選項的UDFs用戶定義函數可以在本地模塊和交換查詢中使用,就像內存優化表和磁盤表。
沒有使用NATIVE_COMPILATION編譯選項的UDFs用戶定義函數只能使用交換查詢。
In-memory OLTP已經支持下面的內置安全函數,增加了對RLS的支持
  • IS_MEMBER({‘group’ | ‘role’})

  • IS_ROLEMEMBER (‘role’ [, ‘database_principal’])

  • IS_SRVROLEMEMBER (‘role’ [, ‘login’])

  • ORIGINAL_LOGIN()

  • SESSION_USER

  • CURRENT_USER

  • SUSER_ID([‘login’])

  • SUSER_SID([‘login’] [, Param2])

  • SUSER_SNAME([server_user_sid])

  • SYSTEM_USER

  • SUSER_NAME

  • USER

  • USER_ID([‘user’])

  • USER_NAME([id])

  • CONTEXT_INFO()

  •  
    另一個核心引擎擴展提升就是:基于NUMA節點或CPU的動態分區線程安全內存對象
    這一改進將會使在NUMA硬件上能應付更高的并行負載。線程安全內存對象(type CmemThread)會根據負載特征和爭用情況針對NUMA節點或CPU進行分區動態提升。
    在SQL2012和SQL2014,需要打開跟蹤標志TF 8048 來提升CPU分區里的分區節點里的內存對象。這個改進不但不需要跟蹤標志,并且可以根據CPU爭用情況動態調節分區。
    model數據庫已經改變新建數據庫策略,新建數據庫的初始數據文件大小和日志大小是8MB,增量都為64MB,為了對齊1個PFS (a range of 8088 pages = 64MB))
    https://blogs.msdn.microsoft.com/sql_server_team/new-defaults-for-model-and-user-databases-in-sql-server-2016/
     
    CTP2.3包含了對In-memory數據倉庫(列式存儲 columnStore)的性能優化,NCCI現在可以經由觸發器來創建,也可以允許使用CDC和更改跟蹤(Change Tracking)。
    為了更好的分析列存儲索引,在sys.dm_db_column_store_row_group_physical_stats這個DMV里添加了三個列:transition_to_compressed_state,transition_to_compressed_state_desc,has_vertipaq_optimization
    Nonclustered Columnstore Index (NCCI)
    Clustered Columnstore Index (CCI)
     
     
    SQL Server Analysis Service (SSAS)的增強
    DAX查詢性能提升,優化Tabular 引擎。‘
    DirectQuery 增強,現在DirectQuery 可以用更好的性能來生成更簡單的查詢。
    DAX對變量的支持,變量可以存儲一個表達式的結果作為命名變量,因此可以傳遞一個參數到其他的measure 表達式。
    一旦變量表達式的結果值被計算,值不會被改變,即使這個變量引用了另一個表達式。
     
    SQL Server Reporting Services (SSRS)的增強
    Report Builder已經包含了modern 主題。
    對于最新的瀏覽器,報表渲染已經支持HTML5 標準。
     
     
    SQL Server Integration Service (SSIS)的增強
    oData v4 協議支持,SSIS 錯誤列支持,高級日志級別支持。
    之前SSIS目錄只提供了四種日志級別:None, Basic, Performance ,Verbose
    新的高級日志級別移除了之前不夠靈活性的日志級別
    新機制:當events 觸發的時候可以收集event 上下文
    新的ssis_logreader 角色,允許訪問所有視圖相關的SSISDB 操作日志
    新的日志自定義級別定義日志和events 收集
    允許event 上下文的收集,例如變量值,任務屬性,連接字符串
     
     
    Master Data Service(MDS)的增強
    添加了三個特性
    Many to many 的繼承層次
    商業規則管理的Excel 插件
    合并沖突
     
    查詢執行的增強
    增強 memory grant usage(內存授予使用率)診斷
    增加了下面的擴展事件XEvents 來更好地診斷內存授予使用和問題。
    Showplan xml 增加了每個線程和迭代器的memory grant usage擴展(在RunTimeCountersPerThread節點里)
    query_memory_grant_blocking
    query_memory_grant_resource_semaphores
    query_memory_grant_usage (details on ideal vs granted vs used memory)
    DBCC CHECKDB增強
    1、驗證持久化的計算列和過濾索引
    2、當驗證一個有上千分區的大表的時候,對DBCC CHECKDB做了性能提升,速度會加快
     
     
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(48)

    • 個人分類:生活學習
    ▲top
    • 3月 09 週四 201720:37
    • MySQL的特點


    文章出處
    MySQL的特點
     
    CPU特點
    內存特點
    磁盤特點
    分析
     
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(28)

    • 個人分類:生活學習
    ▲top
    • 3月 09 週四 201720:37
    • SQL Server的鏡像是基于物理塊變化的復制 鏡像Failover之后數據的預熱問題


    文章出處
    SQL Server的鏡像是基于物理塊變化的復制 鏡像Failover之后數據的預熱問題
     
    基于物理塊變化的復制,沒有并行也是很快的。
    邏輯復制的日志是按事務結束的時間排序的,而物理復制是與事務無關的,只要發生了改變,就可以立即傳送到備庫,而且不需要中繼
    而邏輯復制必須等事務結束才能應用,而且需要中繼,例如MySQL的relay log 和SQL Server的分發庫,所以會慢。
    所以說SQL Server的物理鏡像庫沒有并行也是很快的,只是有了并行會更快。
     
    關于Failover之后,數據庫緩存的warm up
    摘抄自《SQL Server 2008實現與維護(MCTS教程)》
     
    數據庫鏡像定期執行數據傳輸,目的是從鏡像數據庫讀入頁面到數據緩存中,這個過程保持鏡像數據庫中的緩存處于半熱狀態。
    鏡像數據庫上的緩存不能反映主體數據庫上的確切內容,但它確實包含了大量數據頁面,因此,Failover之后,SQL Server不需要重建緩存
    對應用程序性能不會有太大影響!
     
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(32)

    • 個人分類:生活學習
    ▲top
    • 3月 09 週四 201720:37
    • SQLSERVER走起微信公眾帳號已經開通搜狗微信搜索

    文章出處
    SQLSERVER走起微信公眾帳號已經開通搜狗微信搜索
     
    請打開下面鏈接
    http://weixin.sogou.com/gzh?openid=oIWsFt-hiIb_oYqQHaBMoNwRB2wM
     
    可以查找所有歷史文章,也可以關注本公眾帳號,在電腦瀏覽器上看更方便!
     
    可以看到最近推送的文章一目了然
     
    媽媽再也不用擔心我找不到歷史文章了o(∩_∩)o 
     
    關注我
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(134)

    • 個人分類:生活學習
    ▲top
    • 3月 09 週四 201720:37
    • SQL Server數據庫鏡像的頁面自動修復原理


    文章出處
    SQL Server數據庫鏡像的頁面自動修復原理
    主庫頁面損壞
     
    鏡像庫頁面損壞
    LSN用來保證事務的時序
    LSN保存在每個數據頁面的頁頭
    在同一臺機器,內存中的數據頁和磁盤中的數據頁保持同步依靠的是數據頁頭的LSN和事務日志LDF文件里的LSN
    當跨機器的時候,內存中的數據頁頭的LSN,主庫的LDF文件,鏡像庫的LDF文件,那么在這三者就搭起了一條溝通的橋梁
    大家通過對比LSN來得知大家的數據是否一致
     
    在分布式數據庫領域,也是需要保證事務時序的,也是通過LSN 有些數據庫例如Oracle用的是SCN來保證各個分布數據庫的時序,保證各個數據庫的數據一致
     
    其實無論是分布式領域還是非分布式領域都是一樣,分布式領域也沒有太多高大上的東西,都是一樣要保證數據一致,都是通過LSN或者類似LSN的東西來搭建橋梁
     
    如有不對的地方,歡迎大家拍磚o(∩_∩)o 
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(15)

    • 個人分類:生活學習
    ▲top
    • 3月 09 週四 201720:37
    • SQL Server鏡像自動生成腳本


    文章出處
    SQL Server鏡像自動生成腳本
     
    鏡像的搭建非常繁瑣,花了一點時間寫了這個腳本,方便大家搭建鏡像
    執行完這個鏡像腳本之后,最好在每臺機器都綁定一下hosts文件,不然的話,鏡像可能會不work
    192.168.1.1 WSQL01
    192.168.1.2 WSQL02
    192.168.1.3 WWEB03
     
    SQL2008R2升級到SQL2014,升級之前先對數據庫進行完整和日志備份,以免升級失敗
     
    請注意:--★Do部分都是需要填寫的
    -- =============================================
    --
    Author: <樺仔>
    --
    Blog: <http://www.cnblogs.com/lyhabc/>
    --
    Create date: <2015/8/18>
    --
    Description: <鏡像自動生成腳本>
    --
    =============================================
    --環境:非域環境
    DECLARE @DBName NVARCHAR(255)
    DECLARE @masterip NVARCHAR(255)
    DECLARE @mirrorip NVARCHAR(255)
    DECLARE @witness NVARCHAR(255)
    DECLARE @masteriptail NVARCHAR(255)
    DECLARE @mirroriptail NVARCHAR(255)
    DECLARE @witnesstail NVARCHAR(255)
    DECLARE @certpath NVARCHAR(MAX)
    DECLARE @Restorepath NVARCHAR(MAX)
    DECLARE @Restorepath1 NVARCHAR(MAX)
    DECLARE @Restorepath2 NVARCHAR(MAX)
    DECLARE @MKPASSWORD NVARCHAR(500)
    DECLARE @LOGINPWD NVARCHAR(500)
    DECLARE @LISTENER_PORT NVARCHAR(500)
    DECLARE @SQL NVARCHAR(MAX)
    if OBJECT_ID ('tempdb..#temp')is not null
    BEGIN
    DROP TABLE #BackupFileList
    END
    CREATE TABLE #BackupFileList
    (
    LogicalName
    NVARCHAR(100) ,
    PhysicalName
    NVARCHAR(100) ,
    BackupType
    CHAR(1) ,
    FileGroupName
    NVARCHAR(50) ,
    SIZE
    BIGINT ,
    MaxSize
    BIGINT ,
    FileID
    BIGINT ,
    CreateLSN
    BIGINT ,
    DropLSN
    BIGINT NULL ,
    UniqueID
    UNIQUEIDENTIFIER ,
    ReadOnlyLSN
    BIGINT NULL ,
    ReadWriteLSN
    BIGINT NULL ,
    BackupSizeInBytes
    BIGINT ,
    SourceBlockSize
    INT ,
    FileGroupID
    INT ,
    LogGroupGUID
    UNIQUEIDENTIFIER NULL ,
    DifferentialBaseLSN
    BIGINT NULL ,
    DifferentialBaseGUID
    UNIQUEIDENTIFIER ,
    IsReadOnly
    BIT ,
    IsPresent
    BIT ,
    TDEThumbprint
    NVARCHAR(100)
    )
    SET NOCOUNT ON
    SET @masterip='172.16.198.254' --★Do
    SET @mirrorip='172.16.198.253' --★Do
    SET @witness='999999' --★Do
    SET @certpath='D:\DBBackup\' --★Do
    SET @Restorepath='D:\DBBackup\' --★Do
    SET @DBName='testmirror' --★Do
    SET @MKPASSWORD='master@2015key123' --★Do
    SET @LOGINPWD='User_Pass@2015key123' --★Do
    SET @LISTENER_PORT='5022' --★Do
    select @masteriptail= PARSENAME(@masterip,2)+'_'+PARSENAME(@masterip,1)
    select @mirroriptail= PARSENAME(@mirrorip,2)+'_'+PARSENAME(@mirrorip,1)
    select @witnesstail= PARSENAME(@witness,2)+'_'+PARSENAME(@witness,1)
    --------------------------------------------------------------------------------
    DECLARE @stat NVARCHAR(MAX)
    SET @stat='--自動生成鏡像腳本V1 By huazai'
    PRINT @stat
    PRINT CHAR(13)+CHAR(13)
    SET @stat='--0、首先確定要做鏡像的庫的恢復模式為完整,用以下sql語句來查看'+CHAR(13)
    +'SELECT [name], [recovery_model_desc] FROM sys.[databases]'+CHAR(13)+CHAR(13)+CHAR(13)
    PRINT '--主:'+@masterip
    PRINT '--備:'+@mirrorip
    PRINT '--見證:'+@witness
    PRINT CHAR(13)+CHAR(13)
    PRINT @stat
    --------------------------------------------------------------------
    PRINT '-- ============================================='
    SET @stat='--1、 在主服務器和鏡像服務器上和見證服務器上創建Master Key 、創建證書 '+CHAR(13)
    +'--主機'+CHAR(13)
    +'USE master;
    CREATE MASTER KEY ENCRYPTION BY PASSWORD =
    '''+@MKPASSWORD+''';'
    +'CREATE CERTIFICATE HOST_'
    +@masteriptail
    +'_cert WITH SUBJECT = ''HOST_'
    +@masteriptail
    +'_certificate'','+CHAR(13)
    +'START_DATE = ''09/20/2010'',EXPIRY_DATE = ''01/01/2099'';'+CHAR(13)
    PRINT @stat
    SET @stat='--備機'+CHAR(13)
    +'USE master;
    CREATE MASTER KEY ENCRYPTION BY PASSWORD =
    '''+@MKPASSWORD+''';'
    +'CREATE CERTIFICATE HOST_'
    +@mirroriptail
    +'_cert WITH SUBJECT = ''HOST_'
    +@mirroriptail
    +'_certificate'','+CHAR(13)
    +'START_DATE = ''09/20/2010'',EXPIRY_DATE = ''01/01/2099'';'+CHAR(13)
    PRINT @stat
    SET @stat='--見證'+CHAR(13)
    +'USE master;
    CREATE MASTER KEY ENCRYPTION BY PASSWORD =
    '''+@MKPASSWORD+''';'
    +'CREATE CERTIFICATE HOST_'
    +@witnesstail
    +'_cert WITH SUBJECT = ''HOST_'
    +@witnesstail
    +'_certificate'','+CHAR(13)
    +'START_DATE = ''09/20/2010'',EXPIRY_DATE = ''01/01/2099'';'+CHAR(13)+CHAR(13)+CHAR(13)+CHAR(13)
    PRINT @stat
    -----------------------------------------------------------
    PRINT '-- ============================================='
    SET @stat='--2、創建鏡像端點,同一個實例上只能存在一個鏡像端點 '+CHAR(13)
    +'--主機'+CHAR(13)
    +'CREATE ENDPOINT Endpoint_Mirroring
    STATE = STARTED
    AS
    TCP ( LISTENER_PORT=
    '+@LISTENER_PORT+' , LISTENER_IP = ALL )
    FOR
    DATABASE_MIRRORING
    ( AUTHENTICATION = CERTIFICATE HOST_
    '
    +@masteriptail
    +'_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );'+CHAR(13)
    PRINT @stat
    SET @stat='--備機'+CHAR(13)
    +'CREATE ENDPOINT Endpoint_Mirroring
    STATE = STARTED
    AS
    TCP ( LISTENER_PORT=
    '+@LISTENER_PORT+' , LISTENER_IP = ALL )
    FOR
    DATABASE_MIRRORING
    ( AUTHENTICATION = CERTIFICATE HOST_
    '
    +@mirroriptail
    +'_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );'+CHAR(13)
    PRINT @stat
    SET @stat='--見證'+CHAR(13)
    +'CREATE ENDPOINT Endpoint_Mirroring
    STATE = STARTED
    AS
    TCP ( LISTENER_PORT=
    '+@LISTENER_PORT+' , LISTENER_IP = ALL )
    FOR
    DATABASE_MIRRORING
    ( AUTHENTICATION = CERTIFICATE HOST_
    '
    +@witnesstail
    +'_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );'+CHAR(13)+CHAR(13)+CHAR(13)
    PRINT @stat
    ----------------------------------------------------------------------------------------
    PRINT '-- ============================================='
    SET @stat='--3、備份證書,然后互換 '+CHAR(13)
    +'--主機'+CHAR(13)
    +'BACKUP CERTIFICATE HOST_'
    +@masteriptail
    +'_cert TO FILE = '+''''+@certpath+'\HOST_'+@masteriptail+'_cert.cer'';'+CHAR(13)
    PRINT @stat
    SET @stat='--備機'+CHAR(13)
    +'BACKUP CERTIFICATE HOST_'
    +@mirroriptail
    +'_cert TO FILE = '+''''+@certpath+'\HOST_'+@mirroriptail+'_cert.cer'';'+CHAR(13)
    PRINT @stat
    SET @stat='--見證'+CHAR(13)
    +'BACKUP CERTIFICATE HOST_'
    +@witnesstail
    +'_cert TO FILE = '+''''+@certpath+'\HOST_'+@witnesstail+'_cert.cer'';'+CHAR(13)+CHAR(13)+CHAR(13)
    PRINT @stat
    ----------------------------------------------------------------------------------
    PRINT '-- ============================================='
    SET @stat='--4、新增主備登陸用戶 '+CHAR(13)
    +'--主機'+CHAR(13)
    +'CREATE LOGIN DB_02_Mirror WITH PASSWORD = '''+@LOGINPWD+''';
    CREATE USER DB_02_Mirror FOR LOGIN DB_02_Mirror;
    CREATE CERTIFICATE HOST_
    '
    +@mirroriptail
    +'_cert AUTHORIZATION DB_02_Mirror FROM FILE ='''+@certpath+'HOST_'+@mirroriptail+'_cert.cer'';'
    +'GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DB_02_Mirror];'+CHAR(13)
    PRINT @stat
    SET @stat='CREATE LOGIN DB_03_Mirror WITH PASSWORD = '''+@LOGINPWD+''';
    CREATE USER DB_03_Mirror FOR LOGIN DB_03_Mirror;
    CREATE CERTIFICATE HOST_
    '
    +@witnesstail
    +'_cert AUTHORIZATION DB_03_Mirror FROM FILE ='''+@certpath+'HOST_'+@witnesstail+'_cert.cer'';'
    +'GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DB_03_Mirror];'+CHAR(13)
    PRINT @stat
    SET @stat='--備機'+CHAR(13)
    +'CREATE LOGIN DB_01_Mirror WITH PASSWORD = '''+@LOGINPWD+''';
    CREATE USER DB_01_Mirror FOR LOGIN DB_01_Mirror;
    CREATE CERTIFICATE HOST_
    '
    +@masteriptail
    +'_cert AUTHORIZATION DB_01_Mirror FROM FILE ='''+@certpath+'HOST_'+@masteriptail+'_cert.cer'';'
    +'GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DB_01_Mirror];'+CHAR(13)
    PRINT @stat
    SET @stat='CREATE LOGIN DB_03_Mirror WITH PASSWORD = '''+@LOGINPWD+''';
    CREATE USER DB_03_Mirror FOR LOGIN DB_03_Mirror;
    CREATE CERTIFICATE HOST_
    '
    +@witnesstail
    +'_cert AUTHORIZATION DB_03_Mirror FROM FILE ='''+@certpath+'HOST_'+@witnesstail+'_cert.cer'';'
    +'GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DB_03_Mirror];'+CHAR(13)
    PRINT @stat
    SET @stat='--見證'+CHAR(13)
    +'CREATE LOGIN DB_01_Mirror WITH PASSWORD = '''+@LOGINPWD+''';
    CREATE USER DB_01_Mirror FOR LOGIN DB_01_Mirror;
    CREATE CERTIFICATE HOST_
    '
    +@masteriptail
    +'_cert AUTHORIZATION DB_01_Mirror FROM FILE ='''+@certpath+'HOST_'+@masteriptail+'_cert.cer'';'
    +'GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DB_01_Mirror];'+CHAR(13)
    PRINT @stat
    SET @stat='CREATE LOGIN DB_02_Mirror WITH PASSWORD = '''+@LOGINPWD+''';
    CREATE USER DB_02_Mirror FOR LOGIN DB_02_Mirror;
    CREATE CERTIFICATE HOST_
    '
    +@mirroriptail
    +'_cert AUTHORIZATION DB_02_Mirror FROM FILE ='''+@certpath+'HOST_'+@mirroriptail+'_cert.cer'';'
    +'GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DB_02_Mirror];'+CHAR(13)+CHAR(13)+CHAR(13)+CHAR(13)
    PRINT @stat
    ------------------------------------------------------------------------------
    PRINT '-- ============================================='
    SET @stat='--5、各個機器都開放5022端口,并且用telnet測試5022端口是否開通 將下面三個腳本各自粘貼到bat文件里'+CHAR(13)
    PRINT @stat
    SET @stat='echo 主庫'+CHAR(13)
    +'telnet '+@mirrorip+' 5022'+CHAR(13)
    +'telnet '+@witness+' 5022'+CHAR(13)
    +'pause'
    PRINT @stat+CHAR(13)+CHAR(13)
    SET @stat='echo 鏡像庫'+CHAR(13)
    +'telnet '+@masterip+' 5022'+CHAR(13)
    +'telnet '+@witness+' 5022'+CHAR(13)
    +'pause'
    PRINT @stat+CHAR(13)+CHAR(13)
    SET @stat='echo 見證'+CHAR(13)
    +'telnet '+@masterip+' 5022'+CHAR(13)
    +'telnet '+@mirrorip+' 5022'+CHAR(13)
    +'pause'
    PRINT @stat+CHAR(13)+CHAR(13)+CHAR(13)
    --------------------------------------------------------------
    PRINT '-- ============================================='
    SET @stat='--6、備份數據庫(完整備份+事務日志備份)'+CHAR(13)
    PRINT @stat
    SET @stat='DECLARE @FileName NVARCHAR(MAX)'+CHAR(13)+CHAR(13)
    PRINT @stat
    SET @stat='--('+@DBName+'數據庫完整備份)'+CHAR(13)
    +'SET @FileName = ''D:\DBBackup\'+@DBName+'_FullBackup_1.bak''
    BACKUP DATABASE [
    '+@DBName+']
    TO DISK=@FileName WITH FORMAT ,COMPRESSION
    '+CHAR(13)+CHAR(13)
    PRINT @stat
    SET @stat='--('+@DBName+'數據庫日志備份)'+CHAR(13)
    +'SET @FileName = ''D:\DBBackup\'+@DBName+'_logBackup_2.bak''
    BACKUP LOG [
    '+@DBName+']
    TO DISK=@FileName WITH FORMAT ,COMPRESSION
    '
    PRINT @stat+CHAR(13)+CHAR(13)+CHAR(13)
    ------------------------------------------------------------------------------
    PRINT '-- ============================================='
    SET @stat='--7、還原數據庫(指定norecovery方式還原)'+CHAR(13)
    PRINT @stat
    SET @Restorepath1=''
    SET @Restorepath2=@Restorepath+@DBName+'_FullBackup_1.bak'
    SET @SQL = 'RESTORE FILELISTONLY FROM DISK = '''+@Restorepath2+''''
    INSERT INTO #BackupFileList EXEC (@SQL);
    DECLARE @LNAME NVARCHAR(2000)
    DECLARE @PNAME NVARCHAR(2000)
    DECLARE CurTBName CURSOR
    FOR
    SELECT LogicalName,PhysicalName
    FROM #BackupFileList
    OPEN CurTBName
    FETCH NEXT FROM CurTBName INTO @LNAME,@PNAME
    WHILE @@FETCH_STATUS = 0
    BEGIN
    SET @Restorepath1=' MOVE N'''+@LNAME+''' TO N'''+@PNAME+''', '+CHAR(13)+@Restorepath1
    FETCH NEXT FROM CurTBName INTO @LNAME,@PNAME
    END
    CLOSE CurTBName
    DEALLOCATE CurTBName
    SET @stat='USE [master]
    RESTORE DATABASE
    '+@DBName+' FROM DISK = N'''+@Restorepath+@DBName+'_FullBackup_1.bak'' WITH FILE = 1,'+CHAR(13)
    +@Restorepath1
    +'NOUNLOAD,NORECOVERY, REPLACE, STATS = 5
    GO
    '
    SET @stat='USE [master]
    RESTORE LOG
    '+@DBName+' FROM DISK = N'''+@Restorepath+@DBName+'_logBackup_2.bak'' WITH FILE = 1,'+CHAR(13)
    +'NOUNLOAD,NORECOVERY, REPLACE, STATS = 5
    GO
    '
    PRINT @stat+CHAR(13)+CHAR(13)
    DROP TABLE #BackupFileList
    --------------------------------------------------------------------------------
    PRINT '-- ============================================='
    SET @stat='--8、增加鏡像伙伴,需要先在備機上執行,再執行主機,鏡像弄好之后,默認為事務安全等級為FULL'+CHAR(13)
    PRINT @stat
    SET @stat='--備機上執行'+CHAR(13)
    +'USE [master]
    GO
    ALTER DATABASE [
    '+@DBName+'] SET PARTNER = '''+'TCP://'+@masterip+':5022''; --主機服務器的ip'+CHAR(13)+CHAR(13)
    PRINT @stat
    SET @stat='--主機上執行'+CHAR(13)
    +'USE [master]
    GO
    ALTER DATABASE [
    '+@DBName+'] SET PARTNER = '''+'TCP://'+@mirrorip+':5022''; --鏡像服務器的ip'+CHAR(13)+CHAR(13)
    PRINT @stat
    SET @stat='ALTER DATABASE ['+@DBName+'] SET PARTNER = '''+'TCP://'+@witness+':5022''; --見證服務器的ip'+CHAR(13)+CHAR(13)
    PRINT @stat

     
     
    希望對大家有幫助
     
     
    最后附上鏡像相關腳本
    --=================================
    --
    拆除鏡像
    SELECT DB_NAME([database_id]) as 'dbname',* FROM sys.[database_mirroring]
    GO
    ALTER DATABASE [test] SET PARTNER OFF
    ALTER DATABASE [test] SET WITNESS OFF
    --=================================
    --
    恢復鏡像
    USE [master]
    GO
    ALTER DATABASE [Demo1] SET PARTNER RESUME
    GO
    --=================================
    --
    掛起鏡像
    USE [master]
    GO
    ALTER DATABASE [Demo1] SET PARTNER SUSPEND
    GO
    --===================================================
    --
    未發送的日志和未重做的日志情況
    WITH tmp AS(
    SELECT
    DB_NAME(Database_id) AS DatabaseName,
    ROW_NUMBER()
    OVER(PARTITION BY Database_id ORDER BY local_time DESC) AS RID,
    *
    FROM msdb.dbo.dbm_monitor_data
    )
    SELECT * FROM tmp
    WHERE RID=1
    --看一下redo_queue 和send_queue
    --=================================
    --
    刪除鏡像
    USE [master]
    GO
    ALTER DATABASE [Demo1] SET PARTNER OFF
    GO
    --=================================
    --
    移除見證服務器
    USE [master]
    GO
    ALTER DATABASE [Demo1] SET WITNESS OFF
    GO
    --=================================
    --
    修改為高性能模式
    USE [master]
    GO
    ALTER DATABASE [Demo1] SET PARTNER SAFETY OFF
    GO
    --=================================
    --
    修改為高安全模式
    USE [master]
    GO
    ALTER DATABASE [Demo1] SET PARTNER SAFETY FULL
    GO
    --=================================
    --
    在高安全下手動轉移鏡像(在主服務器上)
    USE [master]
    GO
    ALTER DATABASE [Demo1] SET PARTNER FAILOVER
    GO
    --=================================
    --
    在高性能下手動轉移鏡像(在從服務器上),此時主服務器已停止
    --
    同樣適用高安全
    USE [master]
    GO
    ALTER DATABASE [Demo1] SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS
    GO
    --=================================
    --
    在鏡像被掛起后恢復鏡像回話
    --
    如鏡像服務器停止后又重啟時,主體服務器會被掛起,使用以下SQL來恢復鏡像
    USE [master]
    GO
    ALTER DATABASE [Demo1] SET PARTNER RESUME
    GO
    --=================================
    --
    將數據庫從還原狀態轉化成正常模式
    USE [master]
    GO
    RESTORE DATABASE [Demo1] WITH RECOVERY
    GO
    --=================================
    --
    修改為高安全模式
    USE [master]
    GO
    ALTER DATABASE [Demo1] SET PARTNER SAFETY FULL
    GO
    --=================================
    --
    在高性能下手動轉移鏡像(在從服務器上),此時主服務器已停止
    --
    同樣適用高安全
    USE [master]
    GO
    ALTER DATABASE [Demo1] SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS
    GO

     
    升級之后
    USE [master]
    GO
    ALTER DATABASE [testmirror] SET COMPATIBILITY_LEVEL = 120
    GO
    /****** Object: Endpoint [Endpoint_Mirroring] Script Date: 2016/12/29 9:23:18 ******/
    DROP ENDPOINT [Endpoint_Mirroring]
    GO

     
     
     
    如有不對的地方,歡迎大家拍磚o(∩_∩)o 
    本文版權歸作者所有,未經作者同意不得轉載。
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(68)

    • 個人分類:生活學習
    ▲top
    «1...111213230»

    pop-under

    參觀人氣

    • 本日人氣:
    • 累積人氣:

    線上人數

    Marquee

    最新文章

    • 文章列表
    • jvm系列(四):jvm調優-命令大全(jps jstat jmap jhat jstack jinfo)
    • spring boot(一):入門篇
    • jvm系列(一):java類的加載機制
    • jvm系列(三):java GC算法 垃圾收集器
    • spring boot 實戰:我們的第一款開源軟件
    • jvm系列(六):jvm調優-從eclipse開始
    • 混合應用技術選型
    • jvm系列(二):JVM內存結構
    • spring boot(五):spring data jpa的使用

    熱門文章

    • (4,647)淺析CentOS和RedHat Linux的區別
    • (1,763)jQuery之前端國際化jQuery.i18n.properties
    • (1,001)Oracle Hint
    • (630)技術筆記:Indy控件發送郵件
    • (516)linux下安裝sqlite3
    • (501)學習筆記: Delphi之線程類TThread
    • (242)VC單選按鈕控件(Radio Button)用法(轉)
    • (104)單條件和多條件查詢
    • (51)淺談config文件的使用
    • (22)基于 Asp.Net的 Comet 技術解析

    文章分類

    • 生活學習 (2,296)
    • 未分類文章 (1)

    最新留言

    • [20/04/24] 我是女生想約炮 有男生願意給我溫暖的嗎?我賴是woyou58 於文章「(1)從底層設計,探討插件式GIS框架的...」留言:
      我叫黎兒女生最近內心掙扎著要不要約炮我的line:woy...

    文章搜尋

    文章精選

    誰來我家

    Live Traffic Feed