批量附加資料庫

来源:http://www.cnblogs.com/jil-wen/archive/2017/07/31/7226249.html
-Advertisement-
Play Games

背景 最近我們在替換生產環境的資料庫伺服器的時候,因該實例下庫比較多,差不多有近200個庫,加上維護視窗的時間有限,所以我們有必要寫段腳本快速批量附加所有的庫,並確保所有的庫都附加成功。當前的情況是所有的庫名都是唯一且不存在庫名相似的情形,如 db_1 和 db_12 不存在這種庫名相似的情況。 環 ...


背景

最近我們在替換生產環境的資料庫伺服器的時候,因該實例下庫比較多,差不多有近200個庫,加上維護視窗的時間有限,所以我們有必要寫段腳本快速批量附加所有的庫,並確保所有的庫都附加成功。當前的情況是所有的庫名都是唯一且不存在庫名相似的情形,如 db_1  和 db_12 不存在這種庫名相似的情況。

環境

Microsoft SQL Server 2012 (SP3-CU2) (KB3137746) - 11.0.6523.0 (X64)  Mar  2 2016 21:29:16  Copyright (c) Microsoft Corporation Web Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)  

過程

第一步 在舊生產環境上執行,獲取所有正式在用的庫名信息
為了確保需附加的庫名,以及為後續附加成功之後檢驗核對是否存在資料庫文件缺少或未成功附加。提前在舊的生產運行如下代碼,並且成功導出結構和數據,再拷貝導出的文件至新的伺服器上執行。
 1 ---讀取源資料庫信息 先用從源資料庫讀取資料庫信息
 2 use master
 3 IF OBJECT_ID('sourcetable') IS NOT NULL
 4     DROP TABLE sourcetable;
 5 SELECT name,
 6     database_id,
 7     0 AS okflag
 8 INTO sourcetable
 9 FROM sys.databases
10 WHERE database_id > 4
11 ORDER BY name;

2 3 4 5 6 7 8  將導出至桌面的wen.sql文件拷至新的伺服器上,併在ssms中成功執行。
第二步  生成批量附加代碼並執行

預設場景是資料庫文件已全部拷貝至新的生產環境,也不存在許可權限制訪問之類的問題。在新的生產環境執行如下代碼

  1 /********
  2 Just for a quick review, xp_dirtree has three parameters:
  3 1 directory - This is the directory you pass when you call the stored procedure; for example 'D:\Backup'.
  4 2 depth  - This tells the stored procedure how many subfolder levels to display.  The default of 0 will display all subfolders.
  5 3 isfile - This will either display files as well as each folder.  The default of 0 will not display any files.
  6 *********/
  7 ---讀取資料庫文件
  8 IF OBJECT_ID('tempdb..#DirectoryTree') IS NOT NULL
  9     DROP TABLE #DirectoryTree;
 10 CREATE TABLE #DirectoryTree
 11 (
 12     id INT IDENTITY(1, 1),
 13     subdirectory NVARCHAR(512),
 14     depth INT,
 15     isfile BIT
 16 );
 17 INSERT #DirectoryTree
 18 (   subdirectory,
 19     depth,
 20     isfile
 21 )
 22 EXEC master..xp_dirtree 'D:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA',  --資料庫文件存放路徑,如有多個路徑類似。
 23     1,
 24     1;
 25 --SELECT *
 26 --FROM #DirectoryTree;
 27 ---生成附加代碼
 28 DECLARE @file VARCHAR(MAX);
 29 SET @file
 30     = 'D:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\'; ---具體數據文件存放的路徑
 31 DECLARE @name VARCHAR(500),  --資料庫名
 32     @database_id INT,        --資料庫ID
 33     @temp VARCHAR(MAX);      --存放附加代碼
 34 SET @temp = '';
 35 DECLARE c_wen CURSOR FAST_FORWARD
 36 FOR
 37 SELECT name,
 38     database_id
 39 FROM sourcetable
 40 ORDER BY name;
 41 OPEN c_wen;
 42 FETCH NEXT FROM c_wen
 43 INTO @name,
 44     @database_id;
 45 WHILE @@FETCH_STATUS = 0
 46 BEGIN
 47     DECLARE @id INT,        --存放附加文件個數值
 48         @temp_id INT,       --存放最大附加文件個數值
 49         @subdirectory VARCHAR(MAX), --待附加的文件名
 50         @t VARCHAR(MAX);    --存放單個庫附加的代碼
 51     SET @t = '';
 52     SELECT @id = COUNT(1)
 53     FROM #DirectoryTree
 54     WHERE subdirectory LIKE '%' + @name + '%';
 55     SELECT @temp_id = COUNT(1)
 56     FROM #DirectoryTree
 57     WHERE subdirectory LIKE '%' + @name + '%';
 58     SELECT ROW_NUMBER() OVER (ORDER BY subdirectory) id,
 59         subdirectory
 60     FROM #DirectoryTree
 61     WHERE subdirectory LIKE '%' + @name + '%';
 62     WHILE (@id) >= 1       --存在多個需附加的文件
 63     BEGIN
 64         SELECT @subdirectory = subdirectory
 65         FROM
 66         (
 67             SELECT ROW_NUMBER() OVER (ORDER BY subdirectory) id,
 68                 subdirectory
 69             FROM #DirectoryTree
 70             WHERE subdirectory LIKE '%' + @name + '%'
 71         ) a
 72         WHERE a.id = @id;
 73         SELECT @t
 74             = @t + '''' + @file + @subdirectory + ''''
 75               + CASE
 76                     WHEN @id > 1 THEN
 77                         ','
 78                     ELSE
 79                         '; ' + CHAR(10) + CHAR(13) + 'GO'
 80                 END + CHAR(10) + CHAR(13);
 81         SET @id = @id - 1;
 82     END;
 83     IF (
 84            @temp_id = 0    --只有庫名,不存在附加文件
 85        )
 86     BEGIN
 87         SELECT @t = '';
 88     END;
 89     ELSE
 90     BEGIN
 91         SELECT @t
 92             = 'EXEC sys.sp_attach_db ' + '''' + @name + '''' + ',' + CHAR(10)
 93               + CHAR(13) + @t;
 94     END;
 95     FETCH NEXT FROM c_wen
 96     INTO @name,
 97         @database_id;
 98     SELECT @temp = @temp + @t;
 99 END;
100 SELECT @temp
101 FOR XML PATH('');
102 CLOSE c_wen;
103 DEALLOCATE c_wen;

9

複製xml文件中批量附加代碼在新視窗執行。  
第三步  驗證在新的生產環境執行
附加完畢需驗證是否存在失敗或遺漏的情況;
 1 use master
 2 --計算原來生產環境的庫合計
 3 select count(1) from [dbo].[sourcetable]  
 4 ---缺失或失敗的庫名
 5 select 
 6      a.name 
 7 from [sourcetable] a  left join 
 8      sys.databases b 
 9      on a.name=b.name
10 where b.name is null

10

參考 

sp_attach_db

後記

有興趣的同學可以考慮使用PowerShell,如foreach折騰一下。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 參考文檔:http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-common/FileSystemShell.html Hadoop createSnapshot和deleteSnapshot命令,請戳一下鏈接: create ...
  • 前陣子遷移zabbix到tokudb,整理部分操作筆記到這篇博文。 如果轉載,請註明博文來源: www.cnblogs.com/xinysu/ ,版權歸 博客園 蘇家小蘿蔔 所有。望各位支持! 如果轉載,請註明博文來源: www.cnblogs.com/xinysu/ ,版權歸 博客園 蘇家小蘿蔔 ...
  • 2.收縮日誌文件 3.恢複數據庫為完整模式 ...
  • 解決: /etc/my.cnf vim編輯 添加 ...
  • 上一篇,我們介紹Impala的介紹及安裝。    下麵我們開始繼續進一步的瞭解Impala的相關操作。 ...
  • 回來寫博客,少年前端時間被django迷了心魄 如果轉載,請註明博文來源: www.cnblogs.com/xinysu/ ,版權歸 博客園 蘇家小蘿蔔 所有。望各位支持! 如果轉載,請註明博文來源: www.cnblogs.com/xinysu/ ,版權歸 博客園 蘇家小蘿蔔 所有。望各位支持! ...
  • 在mysql中,篩選非空的時候經常會用到is not null和!=null,這兩種方法單從字面上來看感覺是差不多的,其實如果去運行一下試試的話差別會很大!為什麼會出現這種情況呢?null 表示什麼也不是, 不能=、>、< … 所有的判斷,結果都是false,所有隻能用 is null進行判斷。預設 ...
  • 目錄 · 概述 · 原理 · 組成 · 執行流程 · 性能 · API · 應用程式模板 · 通用讀寫方法 · RDD轉為DataFrame · Parquet文件數據源 · JSON文件數據源 · Hive數據源 · 資料庫JDBC數據源 · DataFrame Operation · 性能調優 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...