Tách cơ sở dữ liệu vĩnh viễn


10

Nếu một cơ sở dữ liệu được tách ra khỏi một cá thể vĩnh viễn, có bất kỳ nhiệm vụ dọn dẹp nào cần được thực hiện không?


1
Bạn có thể giải thích trường hợp sử dụng để tách cơ sở dữ liệu vĩnh viễn không? Tại sao không bỏ nó?
Joe Obbish

Câu trả lời:


13

Nếu bạn tách cơ sở dữ liệu khỏi một cá thể, bạn sẽ cần thực hiện xóa tệp ở cấp độ hệ điều hành. Cách tiếp cận an toàn hơn là bỏ cơ sở dữ liệu thay thế.

Những gì tôi đề xuất là lấy bản sao lưu cơ sở dữ liệu cuối cùng sau khi bạn đặt nó vào chế độ Chỉ đọc (vì điều này sẽ đảm bảo không có hoạt động nào xảy ra trong quá trình sao lưu), sau đó loại bỏ nó khỏi hệ thống của bạn bằng lệnh Drop Database .

Toàn bộ các lệnh sẽ trông tương tự như sau:

-- Use master db to ensure you don't have an active connection to the db you wish to affect
USE [master]
GO

-- This will kill any active transactions, but will force the database into a Read-Only state
ALTER DATABASE [db_name] SET READ_ONLY WITH ROLLBACK IMMEDIATE
GO

BACKUP DATABASE [db_name] -- Fill in more options here or use the UI to take a backup if you chooose
GO

-- This will kick out all connections from the database allowing you to drop it.
ALTER DATABASE [db_name] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

-- Drop the database (which automatically removes the files from the OS)
DROP DATABASE [db_name]
GO

Sau này, bạn sẽ muốn tìm kiếm bất kỳ Công việc nào chạy các kịch bản dựa trên cơ sở dữ liệu. Tôi sẽ đề nghị bạn chỉ cần chờ xem điều gì thất bại (sau đó bạn có thể viết ra / xóa công việc) vì có rất nhiều cách mà một công việc có thể tham chiếu cơ sở dữ liệu (không phải tất cả đều dễ xác định).

Cuối cùng, bạn sẽ muốn xóa bất kỳ người dùng nào khỏi trường hợp chỉ có quyền truy cập vào cơ sở dữ liệu này. Kịch bản này sẽ xác định những người dùng đó là ai, mặc dù phiên bản của Max sạch hơn nhiều (tôi không nhận ra anh ta đã đăng một cách tiếp cận cho đến khi tôi chỉnh sửa câu trả lời của mình để bao gồm điều này):

DECLARE @ExecString NVARCHAR (4000)

-- Create Empty Table in a very lazy manner
SELECT  name, principal_id, CAST('' AS NVARCHAR(128)) as database_name
INTO ##tmp_AllDBUsers
FROM sys.server_principals
WHERE 1 = 2

-- Declare Cursor to iterate through all DBs on the instance
DECLARE dbCursor CURSOR
FOR
        SELECT name
        FROM sys .databases


DECLARE @name NVARCHAR (128)
OPEN dbCursor
FETCH NEXT FROM dbCursor
INTO @name

WHILE @@FETCH_STATUS = 0
BEGIN

    SET @ExecString = 
    'USE [' + @name + '];
    INSERT INTO ##tmp_AllDBUsers
    SELECT sp.name, sp.principal_id, DB_NAME()
    FROM sys.server_principals sp INNER JOIN sys.database_principals dp
        ON sp.sid = dp.sid'

    EXEC(@ExecString)

    FETCH NEXT FROM dbCursor
    INTO @name
END

-- Close and deallocate the cursor because you've finished traversing all it's data
CLOSE dbCursor
DEALLOCATE dbCursor

-- Show all logins that do not belong to a server-level role nor have access to any databases
SELECT sp.*
FROM sys.server_principals sp LEFT JOIN ##tmp_AllDBUsers adu
    ON sp.principal_id = adu.principal_id
WHERE adu.principal_id IS NULL
    AND sp.principal_id NOT IN (SELECT member_principal_id
                            FROM sys.server_role_members)
    AND TYPE IN ('S', 'U', 'G')

-- cleanup
DROP TABLE ##tmp_AllDBUsers

13

Tôi đã nêu lên câu trả lời của John; Tôi chỉ muốn thêm một số chi tiết về các mặt hàng khác mà bạn có thể muốn dọn dẹp.

  1. Các công việc và cảnh báo của SQL Server Agent có thể tham chiếu cơ sở dữ liệu. Làm sạch chúng sẽ ngăn chặn các lỗi không cần thiết được báo cáo.

  2. Xóa mọi Đăng nhập được tạo riêng cho cơ sở dữ liệu. T-SQL sau đây sẽ xác định thông tin đăng nhập ứng viên có thể mà bạn có thể điều tra để xem liệu chúng có đang được sử dụng không. Mã xác định thông tin đăng nhập không được tham chiếu bởi bất kỳ cơ sở dữ liệu nào.

    DECLARE @cmd nvarchar(max);
    SET @cmd = '    SELECT sp.sid
        FROM master.sys.server_principals sp
    ';
    SELECT @cmd = @cmd + '  EXCEPT 
        SELECT dp.sid
        FROM ' + QUOTENAME(d.name) + '.sys.database_principals dp
    '
    FROM sys.databases d
    WHERE d.[state] <> 6; --ignore offline DBs
    
    SET @cmd = 'SELECT spr.*
    FROM (
    ' + @cmd + '
    ) src
        INNER JOIN master.sys.server_principals spr
            ON src.sid = spr.sid
    WHERE spr.type <> ''R''
        AND spr.name NOT LIKE ''%##MS_%''
        AND spr.name NOT LIKE ''NT %''
        AND NOT EXISTS (
            SELECT 1
            FROM sys.server_role_members srm
            WHERE srm.member_principal_id = spr.principal_id
                )
    ORDER BY spr.name;
    ';
    EXEC sys.sp_executesql @cmd;
  3. Thiết bị sao lưu có thể tồn tại cho cơ sở dữ liệu đó. Mặc dù loại bỏ chúng là không thực sự cần thiết, nhưng nếu chúng không được sử dụng, chúng nên đi để loại bỏ sự nhầm lẫn tiềm ẩn trong tương lai.

  4. Kích hoạt cấp máy chủ có thể tham chiếu cơ sở dữ liệu.

  5. Tìm kiếm các kế hoạch bảo trì tham chiếu cơ sở dữ liệu - chúng sẽ thất bại nếu chúng không được cập nhật để xóa cơ sở dữ liệu bị thiếu.


Ngoài ra các tập tin hệ điều hành từ DB vẫn còn đó. Không ảnh hưởng đến môi trường máy chủ SQL, nhưng chúng có thể cần phải bị xóa hoặc lưu trữ để giải phóng không gian đĩa
CaM

@CaM: Điều đó đã được tính bởi câu trả lời của John. Đề xuất của John là bỏ cơ sở dữ liệu thay vì tách rời nó và thả DB trong SQL Server có nghĩa là xóa các tệp DB khỏi hệ thống tệp.
Andriy M

1

Tất cả các điểm chính đã được bảo hiểm. Dưới đây là 2 xu của tôi:

Việc tách rời một cơ sở dữ liệu không bao giờ là một giải pháp lâu dài vì nó được dự định sẽ được sử dụng để di chuyển các tệp cơ sở dữ liệu trong máy chủ hoặc đến một máy chủ khác. Xóa cơ sở dữ liệu vĩnh viễn có thể được thực hiện bằng tùy chọn Xóa trong SSMS hoặc lệnh cơ sở dữ liệu DROP như đã đề cập ở trên.

Thông thường các cơ sở dữ liệu được cố ý giữ ngoại tuyến và tiếp tục tạo Cảnh báo là những cơ sở chúng tôi tách ra và giữ cho đến khi nó có thể bị xóa vĩnh viễn (Đã xóa).

Nhiệm vụ trước khi tách: Chạy sp_helpdb dbnameđể biết vị trí tệp.

Nhiệm vụ dọn dẹp:

  1. Xóa các tệp mdf, ndf và ldf của cơ sở dữ liệu khỏi các vị trí chúng cư trú.
  2. Các tệp sao lưu cũ cho cơ sở dữ liệu cần phải được xóa hoặc chuyển sang một máy chủ khác xem xét thời gian lưu giữ của bạn.

Khác với Đăng nhập, Công việc Đại lý, Kích hoạt và các điểm đã được đề cập bởi Max, 2 điều này cũng có thể được xem xét.

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.