Có khôi phục cơ sở dữ liệu xóa bộ đệm bộ đệm và bộ nhớ cache được lưu trữ


8

trên máy chủ phát triển của chúng tôi, chúng tôi làm mới cơ sở dữ liệu (khôi phục từ bản sao lưu sản xuất) mỗi tuần. Câu hỏi của tôi là khôi phục db xóa bộ đệm bộ đệm / bộ đệm thủ tục lưu trữ từ bộ nhớ sql? Nó có tác dụng tương tự / tương tự của DBCC FREEPROCCACHEDBCC DROPCLEANBUFFERS

Cảm ơn.


2
Nếu bạn đang khôi phục từ bản sao lưu, thì tôi không tin điều đó. Tôi có thể sai và sẽ vui vẻ nghe tại sao.
Kermit

Câu trả lời:


13

Đúng. Bộ đệm và bộ đệm kế hoạch được liên kết với cơ sở dữ liệu trước khi khôi phục không liên quan đến cơ sở dữ liệu sau khôi phục, vì vậy chúng sẽ bị xóa. Đối với tất cả ý định và mục đích, cơ sở dữ liệu được khôi phục là một thực thể hoàn toàn riêng biệt, không liên quan. Không có gì trong bộ nhớ cache có thể được sử dụng lại.


12

Câu hỏi thú vị và (bây giờ tôi thấy rằng @ MarkStorey-Smith đã trả lời Tôi ngần ngại trả lời - vì vậy hãy chấp nhận anh ấy kể từ khi anh ấy trả lời trước) Tôi quyết định thực hiện một số kiểm tra. Tôi có một cơ sở dữ liệu được đặt tên analysistrên một trong những máy ảo cục bộ của tôi. Vì vậy, tôi đã chạy tập lệnh này (thêm thông tin về bộ đệm và cơ sở cho các truy vấn của tôi có thể được tìm thấy ở đây ):

SELECT database_id 
    FROM sys.databases
    WHERE name = 'analysis';
GO
-- database_id = 7


            DECLARE @total_buffer INT;
            SELECT  @total_buffer = cntr_value
                FROM sys.dm_os_performance_counters
                WHERE RTRIM([object_name]) LIKE '%Buffer Manager'
                    AND (counter_name = 'Total Pages' --this is 2008
                    OR counter_name = 'Database pages'); -- this is 2012
            ;WITH src AS (
                SELECT
                    database_id, DB_Buffer_Pages = COUNT_BIG(*)
                    FROM sys.dm_os_buffer_descriptors
                    --WHERE database_id BETWEEN 5 AND 32766
                    GROUP BY database_id
                )

            SELECT 
                @@SERVERNAME AS InstanceName,
                GETDATE() AS collection_date,
                database_name = DB_NAME(mem.database_id), 
                db_buffer_pages, 
                cached_size_mb,
                db_buffer_pct, 
                cpu_time, 
                cpu_percent_usage, 
                total_io_mb, 
                io_percent          
            FROM (              
                    SELECT
                    database_id,
                    db_buffer_pages = DB_Buffer_Pages,
                    cached_size_mb = DB_Buffer_Pages / 128.0,
                    db_buffer_pct = CONVERT(DECIMAL(6,3),
                                        DB_Buffer_Pages * 100.0 / @total_buffer)        
                    FROM src
                ) mem
                JOIN (
                        SELECT 
                            database_id, cpu_time, 
                            CAST(cpu_time * 1.0 / SUM(cpu_time) OVER() * 100.0 AS DECIMAL(5, 2)) AS cpu_percent_usage
                        FROM (
                                SELECT database_id, SUM(total_worker_time) AS cpu_time
                                FROM sys.dm_exec_query_stats AS qs
                                CROSS APPLY (SELECT CONVERT(int, value) AS database_id 
                                                FROM sys.dm_exec_plan_attributes(qs.plan_handle)
                                                WHERE attribute = N'dbid') AS F_DB
                                GROUP BY database_id) DB_CPU_Stats
                ) cpu
                    ON mem.database_id = cpu.database_id
                JOIN (
                        SELECT database_id, io_in_mb AS [total_io_mb],
                            CAST(io_in_mb/ SUM(io_in_mb) OVER() * 100.0 AS DECIMAL(5,2)) AS [io_percent]
                        FROM (
                                SELECT database_id,
                                    CAST(SUM(num_of_bytes_read + num_of_bytes_written)/1048576 AS DECIMAL(12, 2)) AS io_in_mb
                                FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS [DM_IO_STATS]
                                GROUP BY database_id) Aggregate_IO_Statistics) [io]
                ON mem.database_id = [io].database_id             
            where mem.database_id = 7
GO  


-- 471

USE master
GO

BACKUP DATABASE analysis TO DISK=N'analysis.bak';
GO
BACKUP LOG analysis TO DISK=N'analysis.trn' WITH NORECOVERY;
GO
RESTORE DATABASE analysis FROM DISK=N'analysis.bak' WITH NORECOVERY;
GO
RESTORE DATABASE analysis FROM DISK=N'analysis.trn';
GO


            DECLARE @total_buffer INT;
            SELECT  @total_buffer = cntr_value
                FROM sys.dm_os_performance_counters
                WHERE RTRIM([object_name]) LIKE '%Buffer Manager'
                    AND (counter_name = 'Total Pages' --this is 2008
                    OR counter_name = 'Database pages'); -- this is 2012
            ;WITH src AS (
                SELECT
                    database_id, DB_Buffer_Pages = COUNT_BIG(*)
                    FROM sys.dm_os_buffer_descriptors
                    --WHERE database_id BETWEEN 5 AND 32766
                    GROUP BY database_id
                )

            SELECT 
                @@SERVERNAME AS InstanceName,
                GETDATE() AS collection_date,
                database_name = DB_NAME(mem.database_id), 
                db_buffer_pages, 
                cached_size_mb,
                db_buffer_pct, 
                cpu_time, 
                cpu_percent_usage, 
                total_io_mb, 
                io_percent          
            FROM (              
                    SELECT
                    database_id,
                    db_buffer_pages = DB_Buffer_Pages,
                    cached_size_mb = DB_Buffer_Pages / 128.0,
                    db_buffer_pct = CONVERT(DECIMAL(6,3),
                                        DB_Buffer_Pages * 100.0 / @total_buffer)        
                    FROM src
                ) mem
                JOIN (
                        SELECT 
                            database_id, cpu_time, 
                            CAST(cpu_time * 1.0 / SUM(cpu_time) OVER() * 100.0 AS DECIMAL(5, 2)) AS cpu_percent_usage
                        FROM (
                                SELECT database_id, SUM(total_worker_time) AS cpu_time
                                FROM sys.dm_exec_query_stats AS qs
                                CROSS APPLY (SELECT CONVERT(int, value) AS database_id 
                                                FROM sys.dm_exec_plan_attributes(qs.plan_handle)
                                                WHERE attribute = N'dbid') AS F_DB
                                GROUP BY database_id) DB_CPU_Stats
                ) cpu
                    ON mem.database_id = cpu.database_id
                JOIN (
                        SELECT database_id, io_in_mb AS [total_io_mb],
                            CAST(io_in_mb/ SUM(io_in_mb) OVER() * 100.0 AS DECIMAL(5,2)) AS [io_percent]
                        FROM (
                                SELECT database_id,
                                    CAST(SUM(num_of_bytes_read + num_of_bytes_written)/1048576 AS DECIMAL(12, 2)) AS io_in_mb
                                FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS [DM_IO_STATS]
                                GROUP BY database_id) Aggregate_IO_Statistics) [io]
                ON mem.database_id = [io].database_id             
            where mem.database_id = 7

--242

471 Trang đệm trước khi khôi phục, 242 sau đó. Thật không may, tôi đã không tổng hợp các loại trang trong bộ đệm nhưng tôi dám chắc rằng các trang trong bộ đệm phải thực hiện với tôi khi chạy các truy vấn phân tích bộ đệm.

Đây là kết quả của truy vấn cho trước và sau khôi phục phân tích ... analysis.

TRƯỚC: nhập mô tả hình ảnh ở đây

BÀI ĐĂNG: nhập mô tả hình ảnh ở đây


9

Giống như Swasheck và Mark tôi bắt đầu chơi khi cái này xuất hiện. Xin đừng chấp nhận câu trả lời này, chấp nhận Mark, trên thực tế thậm chí không cho tôi điểm, tôi không có ảnh chụp màn hình khi tôi thấy Swasheck đăng những gì tôi đã bắt đầu làm việc, nhưng điều này quá dài cho một nhận xét.

Vì vậy, câu trả lời ngắn gọn là: Có, bạn ổn

Điều đó nói rằng, tôi đã nghe nói về các báo cáo trong các phiên bản SQL trước đây, nơi mọi người dường như nghĩ rằng điều này là bắt buộc. Vì vậy, tôi muốn chắc chắn và tôi đã làm một bài kiểm tra. Tôi đã tạo một cơ sở dữ liệu, tạo một số bảng và sau đó sử dụng truy vấn của Glenn để xem có bao nhiêu cơ sở dữ liệu đó trong bộ đệm bộ đệm trước khi khôi phục. Trước khi tôi có khoảng 50,2 MB dữ liệu, sau khi tôi có khoảng 1,5 MB dữ liệu - điều này rất có thể là do một cái gì đó sau khi khôi phục, không phải vì dữ liệu bị treo.

Tôi cũng đã chạy một số truy vấn trước đó và bao gồm các bí danh bảng như "foo" để tôi có thể tìm thấy chúng trong bộ đệm bằng cách sử dụng truy vấn bên dưới. Tôi thấy tất cả ở đó, đã khôi phục và họ đã biến mất.

SELECT st.text, qs. sql_handle, qs.plan_handle
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(sql_handle) st
where text like '%foo%'

Vì vậy, tôi có thể nói chắc chắn trong thử nghiệm giới hạn của mình trên SQL Server 2012, các dấu vết của DB đã biến mất khỏi vùng đệm và bộ đệm kế hoạch hoàn toàn. Điều này có ý nghĩa bởi vì DB mà chúng liên quan đến biến mất, đó là hành vi dự kiến.

Điều đó nói rằng - sau khi khôi phục một điều bạn chắc chắn nên xem xét làm là cập nhật số liệu thống kê của bạn. Tôi thích bắt đầu với việc xây dựng số liệu thống kê sạch và tôi thực sự muốn thấy mọi người sử dụng sản xuất như dữ liệu trong dev và tôi thích bắt đầu với số liệu thống kê sạch. Vì vậy, tốt cho bạn để sử dụng dữ liệu thực trong dev. (Hãy cẩn thận - đôi khi bạn cần xác định lại dữ liệu của mình trước khi thực hiện việc này, nhưng yay để thử nghiệm với các phân phối và kích thước dữ liệu thực.)


1

Tôi vui mừng báo cáo lại. khôi phục đã được thực hiện vài phút trước cho VLDB (1TB) (SQL2008R2 SP2CU7). Như nghi ngờ, bộ đệm dữ liệu đã biến mất khá nhiều sau khi khôi phục. Vì vậy, tất cả các câu trả lời trên là chính xác.

PRIOR
ObjectName  object_id   index_id    buffer size(MB) buffer_count
table_1 185767719   1   29434   3767645
table_2 1531152500  1   559 71604

POST                
ObjectName  object_id   index_id    buffer size(MB) buffer_count
table_1 185767719   1   34  4367
table_2 1531152500  1   22  2879

Để có được số liệu thống kê, tôi đã sử dụng một tập lệnh mượn / lấy trộm từ bài đăng liên quan được gợi ý bởi Mark. Rất hữu ích. Cảm ơn.


SELECT OBJECT_NAME (p. object_id) AS [ObjectName],p. object_id,p .index_id, count(*)/128 AS [buffer size(MB)],count(*) AS [buffer_count]
FROM sys .allocation_units AS a
     INNER JOIN sys. dm_os_buffer_descriptors AS b ON a.allocation_unit_id= b.allocation_unit_id
     INNER JOIN sys. partitions AS p ON a .container_id= p.hobt_id
WHERE b. database_id=DB_ID () AND p.object_id >100
GROUP BY p.object_id ,p. index_id
ORDER BY buffer_count DESC;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.