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