很多數(shù)據(jù)庫的專家就讀
成都創(chuàng)新互聯(lián)公司網(wǎng)站建設公司是一家服務多年做網(wǎng)站建設策劃設計制作的公司,為廣大用戶提供了網(wǎng)站建設、成都做網(wǎng)站,成都網(wǎng)站設計,廣告投放,成都做網(wǎng)站選成都創(chuàng)新互聯(lián)公司,貼合企業(yè)需求,高性價比,滿足客戶不同層次的需求一站式服務歡迎致電。
C擴兒
/'si:kul/
本人一直念“西口”,“C扣”
也有些人念“色扣”
但是請不要三個字母念:S—Q—L,這樣是錯的,會被業(yè)內(nèi)人笑的。
SQLServer
[sik?u
's?:v?]
CPU占用過高診斷思路
mpstat -P ALL 1,查看cpu使用情況,主要消耗在sys即os系統(tǒng)調(diào)用上
perf top,cpu主要消耗在_spin_lock
生成perf report查看詳細情況
CPU主要消耗在mutex爭用上,說明有鎖熱點。
采用pt-pmp跟蹤mysqld執(zhí)行情況,熱點主要集中在mem_heap_alloc和mem_heap_free上。
Pstack提供更詳細的API調(diào)用棧
Innodb在讀取數(shù)據(jù)記錄時的API路徑為
row_search_for_mysql --》row_vers_build_for_consistent_read --》mem_heap_create_block_func --》mem_area_alloc --》malloc --》 ?_L_unlock_10151 --》__lll_unlock_wait_private
row_vers_build_for_consistent_read會陷入一個死循環(huán),跳出條件是該條記錄不需要快照讀或者已經(jīng)從undo中找出對應的快照版本,每次循環(huán)都會調(diào)用mem_heap_alloc/free。
而該表的記錄更改很頻繁,導致其undo history list比較長,搜索快照版本的代價更大,就會頻繁的申請和釋放堆內(nèi)存。
Linux原生的內(nèi)存庫函數(shù)為ptmalloc,malloc/free調(diào)用過多時很容易產(chǎn)生鎖熱點。
當多條 SQL 并發(fā)執(zhí)行時,會最終觸發(fā)os層面的spinlock,導致上述情形。
解決方案
將mysqld的內(nèi)存庫函數(shù)替換成tcmalloc,相比ptmalloc,tcmalloc可以更好的支持高并發(fā)調(diào)用。
修改my.cnf,添加如下參數(shù)并重啟
[mysqld_safe]malloc-lib=tcmalloc
上周五早上7點執(zhí)行的操作,到現(xiàn)在超過72小時,期間該實例沒有再出現(xiàn)cpu長期飆高的情形。
以下是修改前后cpu使用率對比
SQLServer數(shù)據(jù)庫的快照只能通過SQL語句創(chuàng)建,以msdb數(shù)據(jù)庫為例進行說明:
1、執(zhí)行以下代碼,看看MSDB數(shù)據(jù)庫有多少數(shù)據(jù)文件
EXEC SP_HELPDB msdb
2、為每一個數(shù)據(jù)文件創(chuàng)建快照,代碼如下:
create database snap_MSDBData_1811221202
ON ( NAME = MSDBData, FILENAME= 'D:\userdata\temp\Snap_MSDBData.snap')
AS SNAPSHOT OF MSDB
3、在“數(shù)據(jù)庫快照”那里就可以看到剛剛創(chuàng)建snap_MSDBData_1811221202這個快照了,對比一下快照和原庫,內(nèi)容是一樣的
4、數(shù)據(jù)庫快照其實也是一個數(shù)據(jù)庫,可以在上面執(zhí)行任何SQL語句,我們執(zhí)行一個查詢語句看看效果
SELECT *? FROM [MSDB].[dbo].[MSdbms]
SELECT *? FROM [snap_MSDBData_1811221202].[dbo].[MSdbms]
查詢結果是完全一樣的。
(如有幫助,請采納,謝謝)
在SQL Server 2005中,它的另外一個強大的新特點是數(shù)據(jù)庫快照。數(shù)據(jù)庫快照是一個數(shù)據(jù)庫的只讀副本,它是數(shù)據(jù)庫所有數(shù)據(jù)的映射,由快照被執(zhí)行的時間點來決定它的內(nèi)容。
這些數(shù)據(jù)庫快照在報表方面是非常有價值,因為在快照數(shù)據(jù)庫中或者在原數(shù)據(jù)庫中,對于任何查詢而言沒有鎖就將被執(zhí)行。快照也可以使用在災難恢復中,因為你可以將現(xiàn)有的數(shù)據(jù)恢復到現(xiàn)有的快照中,或者還可以在有害數(shù)據(jù)操作聲明的事件中存儲個別必要的表和數(shù)據(jù)。
數(shù)據(jù)庫快照是如何工作的?
可以使用典型的數(shù)據(jù)庫命令CREATE DATABASE語句來生成一個數(shù)據(jù)庫快照,在聲明中有一個源數(shù)據(jù)庫快照的附加說明。當快照被建立時,同時生成一個稀疏文件。這個文件(只能使用在NTFS卷中)在初始化的時候并沒有磁盤空間分配給它——盡管你可能在WINDOWS資源管理器中看到了文件的大小,它會看上去與原始的源數(shù)據(jù)庫文件的大小相同。對磁盤來說其實這個文件的大小接近于零。
數(shù)據(jù)庫快照在初始化時讀的數(shù)據(jù)文件是來自于源數(shù)據(jù)庫的。當源數(shù)據(jù)庫的數(shù)據(jù)發(fā)生變化時,數(shù)據(jù)引擎就會將原始數(shù)據(jù)從源數(shù)據(jù)庫拷貝到快照數(shù)據(jù)庫中。這個技術確保快照數(shù)據(jù)庫只反映快照被執(zhí)行時數(shù)據(jù)的狀態(tài)。當SELECT命令被用來發(fā)布反對數(shù)據(jù)庫快照時,不管數(shù)據(jù)頁的讀取是否被定位在源數(shù)據(jù)庫數(shù)據(jù)文件中還是在快照數(shù)據(jù)庫數(shù)據(jù)文件中都是沒有鎖被發(fā)布的。因為在只讀數(shù)據(jù)庫快照中是沒有鎖被發(fā)布,數(shù)據(jù)庫快照對于報表解決方案是一個重要的解決方案。
一個快照的實例
現(xiàn)在,讓我們來看看數(shù)據(jù)庫快照在SQL Server 2005中是如何工作的。為此,首先我需要一個源數(shù)據(jù)庫作為快照的來源。下面的腳本將創(chuàng)建一個源數(shù)據(jù)庫:
以下為引用的內(nèi)容:
USE master
GO
IF EXISTS(SELECT name from sysdatabases where [name] = 'SourceDatabase')
DROP DATABASE SourceDatabase
GO
CREATE DATABASE SourceDatabaseON PRIMARY
(
NAME = SourceDatabase_Data,
FILENAME = 'C:SQLServerSourceDatabase_Data.mdf'
) LOG ON
(
NAME = SourceDatabase_Log,
FILENAME = 'C:SQLServerSourceDatabase_Log.ldf'
)
GO
注意這里產(chǎn)品區(qū)域的大小。我定義它的大小為CHAR(150)來強調(diào)數(shù)據(jù)文件的增長級數(shù),這樣在我接下來的實例中將更容易解釋清楚快照是如何工作的。
現(xiàn)在既然我已經(jīng)有了一個源數(shù)據(jù)庫,現(xiàn)在我裝載一些數(shù)據(jù)來擴展數(shù)據(jù)文件的大小位。如此,使用列表1中的腳本來創(chuàng)建銷售歷史表。
以下為引用的內(nèi)容:
USE SourceDatabase
GO
IF OBJECT_ID('SalesHistory')0 DROP TABLE SalesHistory
GO
CREATE TABLE SalesHistory
( SaleID INT IDENTITY(1,1),
Product CHAR(150), SaleDate DATETIME,
SalePrice MONEY
)
DECLARE @i INT
SET @i = 1
WHILE (@i =10000)
BEGIN INSERT INTO SalesHistory (Product, SaleDate, SalePrice)
VALUES ('Computer', DATEADD(mm, @i, '3/11/1919'),
DATEPART(ms, GETDATE()) + (@i + 57) )
INSERT INTO SalesHistory (Product, SaleDate, SalePrice)
VALUES ('BigScreen', DATEADD(mm, @i, '3/11/1927'),
DATEPART(ms, GETDATE()) + (@i + 13) )
INSERT INTO SalesHistory (Product, SaleDate, SalePrice)
VALUES ('PoolTable', DATEADD(mm, @i, '3/11/1908'),
DATEPART(ms, GETDATE()) + (@i + 29) )
SET @i = @i + 1
END
GO
1、查詢SQL中的所有表: Select TABLE_NAME FROM 數(shù)據(jù)庫名稱.INFORMATION_SCHEMA.TABLES Where TABLE_TYPE='BASE TABLE' 執(zhí)行之后,就可以看到數(shù)據(jù)庫中所有屬于自己建的表的名稱 2、查詢SQL中所有表及列: Select dbo.sysobjects.name as Table_name, dbo.syscolumns.name AS Column_name FROM dbo.syscolumns INNER JOIN dbo.sysobjects ON dbo.syscolumns.id = dbo.sysobjects.id Where (dbo.sysobjects.xtype = 'u') AND (NOT (dbo.sysobjects.name LIKE 'dtproperties')) 3、在Sql查詢分析器,還有一個簡單的查詢方法: EXEC sp_MSforeachtable @command1="sp_spaceused '?'" 執(zhí)行完之后,就可以看到數(shù)據(jù)庫中所有用戶表的信息 4、查詢總存儲過程數(shù):select count(*) 總存儲過程數(shù) from sysobjects where xtype='p' 附:xtype類型D = 默認值或 DEFAULT 約束
F = FOREIGN KEY 約束L = 日志FN = 標量函數(shù)
IF = 內(nèi)嵌表函數(shù)
P = 存儲過程
PK = PRIMARY KEY 約束(類型是 K)
RF = 復制篩選存儲過程S = 系統(tǒng)表TF = 表函數(shù)
TR = 觸發(fā)器U = 用戶表UQ = UNIQUE 約束(類型是 K)V = 視圖X = 擴展存儲過程 另:在sqlserver中取得某個數(shù)據(jù)庫中所有表名的sql語句 select sysobjects.name from sysobjects.xtype ='U';SELECT name
WHERE (xtype = 'U') 在數(shù)據(jù)庫的sysobjects表里有這個數(shù)據(jù)庫全部表的信息, xtype值為'U'的就是表名 注意:一般通過上述方法獲得全部用戶表示都會有一個dtproperties表,SQLSERVER 默認它也是用戶表,想要從用戶表中排出,需要加上限定條件 status0,即:select * from sysobjects where xtype='U' and status0
數(shù)據(jù)庫快照為你現(xiàn)有的數(shù)據(jù)庫創(chuàng)建了一個數(shù)據(jù)庫的殼,然后無論何時當數(shù)據(jù)頁被修改的時候,改變也同時被寫入稀疏文件(sparse file)當中。當人們獲取數(shù)據(jù)的時候,數(shù)據(jù)中沒有變化的部分是從原始數(shù)據(jù)庫中得到的,而改變的部分則是從稀疏文件中獲得。
稀疏文件和數(shù)據(jù)庫快照
當數(shù)據(jù)庫快照被創(chuàng)建的時候,第一次的創(chuàng)建是十分迅速的。因為實際上只是創(chuàng)建了一個用來記錄被修改文件的殼。隨著時間的推移,文件不斷的被修改,這些修改頁都將被寫進稀疏文件。你的主數(shù)據(jù)庫中修改的文件越多,就有越多的文件被寫入稀疏文件。因此,有越來越多的磁盤空間被用來保存你的主數(shù)據(jù)庫和快照的數(shù)據(jù)庫,也增加了你服務器的磁盤輸入輸出的次數(shù)。
稀疏文件被寫入大小為64KB的分組塊當中。每一個分組塊增量能包含8個大小為8KB的數(shù)據(jù)頁。所以,每次在你的主數(shù)據(jù)庫中有任何的數(shù)據(jù)改變,都會先把數(shù)據(jù)頁拷貝到稀疏文件當中,然后再將主數(shù)據(jù)庫中文件的變化寫入稀疏文件。一旦數(shù)據(jù)頁被寫入稀疏文件,他們就不再需要被寫出來。因為頁面的全部內(nèi)容被保護起來,讓其處于當快照建立時的狀態(tài)。
為了實現(xiàn)優(yōu)化磁盤并消除磁盤沖突,在主數(shù)據(jù)庫以外的獨立的驅(qū)動器和陣列中創(chuàng)建稀疏文件是一個明知之舉。原因有二:
其一,當快照被建立的時候,沒有數(shù)據(jù)被寫入稀疏文件。從快照進行的所有的數(shù)據(jù)訪問實際上都是在主數(shù)據(jù)庫文件當中的。隨著時間的推移,你會通過在不同的陣列和磁盤上從主文件數(shù)據(jù)庫讀取未被修改過的文件和從稀疏文件讀取修改過的數(shù)據(jù)的方法來減少輸入輸出的負擔。
其二,根據(jù)你數(shù)據(jù)庫數(shù)據(jù)的易變動性和數(shù)據(jù)變化的數(shù)量,你可以通過將在主數(shù)據(jù)庫的讀取工作和稀疏文件的寫入工作分離來減少輸入輸出的瓶頸大小。
使用數(shù)據(jù)庫快照
在這里你一定要記住的事情就是,你的查詢請求訪問的依然是你的主數(shù)據(jù)庫。當初始的快照被建立的時候,其實僅建立了一個空的殼子。所有的數(shù)據(jù)請求都是在主數(shù)據(jù)庫文件中被完成的。隨著時間的流逝和文件不斷地被修改,就有一些數(shù)據(jù)請求從初始的數(shù)據(jù)庫文件中分離出來指向了稀疏文件。所以,盡管看上去它是一個獨立的數(shù)據(jù)庫,那些根本的數(shù)據(jù)仍然是源于主數(shù)據(jù)庫。
鑒于此,你需要確定不要試圖去進行你日常活動范圍以外的查詢。這樣說吧,你創(chuàng)建了一個快照,接著你進行了讀寫的操作,并對每個人做了記錄。當那些記錄被執(zhí)行查詢操作時,他們?nèi)匀焕^續(xù)影響著主數(shù)據(jù)庫。所以你要保證任何新的活動都不會影響主數(shù)據(jù)的活動。
另外,你需要記住到底有哪些數(shù)據(jù)是被寫入稀疏文件里的,而不是認為所有可能的數(shù)據(jù)都被寫進了稀疏文件?;旧?,當快照被創(chuàng)立時,主數(shù)據(jù)庫的大小就是快照稀疏文件的潛在大小。如果稀疏文件中的數(shù)據(jù)量已經(jīng)達到甚至超過數(shù)據(jù)庫的一半時,也許再創(chuàng)造一個數(shù)據(jù)庫的完整拷貝來取代現(xiàn)有的快照是一個更好的主意。
綜上所述,我認為,數(shù)據(jù)庫快照是一個非常新的功能。我也希望在SQL Server2005的所有版本,而不僅僅在企業(yè)版和開發(fā)版中可以應用這個功能。有一個沒有討論的地方就是我們沒有討論有關對數(shù)據(jù)庫鏡像使用快照。其實,無論是鏡像還是原數(shù)據(jù)庫,快照都給了你最好的方法。因為鏡像是離線的,你并不能訪問那些數(shù)據(jù),所以說無論是鏡像還是原數(shù)據(jù)庫,它都給了你最好的方法?;ㄒ恍r間去理解快照是如何應用于你的環(huán)境中的,并且確認你監(jiān)視著維護快照的影響以及通過快照進行的數(shù)據(jù)存儲。
當前文章:sqlserver快照讀,sql server快照
瀏覽路徑:http://www.rwnh.cn/article4/dsdjioe.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設、關鍵詞優(yōu)化、響應式網(wǎng)站、網(wǎng)站策劃、做網(wǎng)站、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)