65.9K
CodeProject 正在变化。 阅读更多。
Home

使用批处理文件(*.Bat)恢复数据库

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.68/5 (8投票s)

2008年6月9日

CPOL

7分钟阅读

viewsIcon

55872

downloadIcon

925

本文介绍如何从现有数据库使用批处理文件从头开始构建数据库

引言

本文介绍如何使用批处理文件从现有数据库从头开始构建数据库。通过本文,您可以了解到构建数据库所需的以下内容:

  1. 如何创建批处理文件
  2. 如何使用iniTool.exe读取*.ini文件
  3. 在批处理文件中使用SqlCmd命令。

使用此方法,与生产环境中的常规方法相比,只需几个步骤即可安装或恢复数据库。

部署数据库的旧方法的缺点

在旧方法中,将现有数据库部署到生产环境,我们需要生成所有脚本(表、存储过程、视图和函数),这些脚本需要从现有数据库(如果表中存在预定义值)复制到生产数据库

在脚本中,我们需要手动替换所有架构名称。这是一个漫长的过程,可以通过上述上下文(方法)来避免。

部署数据库的新方法的优点

  1. 在最短的时间内(约 3-4 分钟)安装恢复数据库。
  2. 无需对脚本进行任何操作(例如手动替换架构名称)
  3. 当系统崩溃时,我们会丢失.mdf.ldf文件,但可以在我们的方法中将这些文件恢复到不同的目录。
  4. 我们可以为新数据库指定角色。
  5. 通过对批处理文件进行少量修改,可以重复使用同一文件。

基础 - 如何创建批处理文件?

可以使用记事本写字板创建批处理文件,只需将文件扩展名保存为.BAT即可。

什么是“.ini”文件?

.ini文件是包含配置信息的纯文本文件。在我们的应用程序(方法)中,此文件用于存储数据库名称、数据库服务器名称、日志文件路径、日志文件大小、数据文件路径、数据文件大小等。

创建/编辑“.ini”文件

可以使用记事本或写字板创建.ini文件,只需将文件扩展名保存为“ .ini ”即可。

“.ini”文件的格式

.ini文件包含一个或多个节。每个节以节名开头,后跟零个或多个条目。条目将键名与值关联。

通用格式是

[section]
keyname = value

可以通过在注释前加上分号 (;) 来在文件中包含注释。

如何读取“.ini”文件?

我们可以使用 iniTool.exe 通过 call 方法读取 ini 文件。

通用格式(语法)

CALL  iniTool.exe   /f:[path of conifg File]  [/s:section]   [/k:key]
 /f: Path to an .ini format file.
 /s: Section name
 /k: Key name

示例> CALL .\INITOOL /f:".\Config.ini" /s:"Setup database" /k:"DBSERVER

/f: Config.ini 是文件名

/k: DBSERVER 是节内的键名

/s: 设置数据库

什么是 SQLCMD (Sqlcmd)?

SQLCMD 是 SQL 2005 服务器中的命令行实用程序,尽管 OSQL 实用程序可以与 SQLCMD 并行使用。SQLCMD 可以在 DOS 屏幕以及 MS SQL Server 2005 Management Studio 的查询编辑器中以 SQLCMD 模式运行。如果要使用脚本执行功能,则必须启用此功能。启用 SQLCMD 后,您可以编写 SQL 命令以及 T-SQL 语句。

SqlCmd 命令行实用程序的一些标签

usage: Sqlcmd            [-U login id]          [-P password]
  [-S server]            [-E trusted connection]
  [-d use database name] [-l login timeout]     [-t query timeout]
  [-w screen width]        [-b On error batch abort] 
 [-I Enable Quoted Identifiers]  [-v var = "value"...] 
  [-c cmdend]            
  [-q "cmdline query"]   [-Q "cmdline query" and exit]
  [-V severitylevel]     [-W remove trailing spaces]
  [-u unicode output]    [-r[0|1] msgs to stderr]
  [-i inputfile]         [-o outputfile]        [-z new password]
  [-Z new password and exit]

在批处理文件中使用 For 循环

使用此 For 循环将配置文件值存储到批处理文件中的变量中。

示例:从配置文件读取数据库名称,然后将[数据库名称]值存储在批处理文件变量中。

Syntax:
        FOR /F ["options"] %%parameter IN (filenameset) DO command 
      
        FOR /F ["options"] %%parameter IN ("Text string to process") DO command
        
Keys:   
   options:
      delims = xxx The delimiter character(s) (default = a space)

      skip = n        Number of lines to skip at the beginning of the file (default = 0).
 
      eol=;             Character to indicate a comment (end of line)

      tokens=n       Specifies  which numbered items to read from each line (default = 1).
          
      usebackq     Specify `back quotes`:                        
                   - Use double quotes to quote long file names in filenameset.
                   - Use single quotes for 'Text string to process'
                     (useful if the text string contains double quotes)

   Filenameset :  A set of one or more files. Wildcards may be used. 
                  If (filenameset) is a period character (.) then FOR will
                  loop through every file in the folder.

   command:  The command to carry out, including any  command-line parameters.
  
   %%parameter :  A replaceable parameter:  in a batch file use  %%G (on the command line %G)

For /f: 处理每个文本文件,方法是一次读取一行文本,然后将该行分解成单独的数据项或“标记”。然后使用找到的标记(或标记集)作为参数执行 DO 命令。

默认情况下,/f: 在每个空格处拆分行,并且会跳过任何空白行。您可以通过指定“options”参数来覆盖此默认解析行为。选项必须包含在“引号”中。

代码解释

您可以通过将文件保存为.INI文件扩展名来创建 .ini 文件,将文件保存为.BAT扩展名来创建批处理文件。在.ini文件中,我正在声明需要创建的键名,如[数据库名称],当前 Db 服务器名称(现有 Db 服务器名称),以及要创建.mdf.ldf文件的日志文件路径和数据文件路径。您可以使用

SP_Attach_DB 'DatabaseName','.mdf file path' 来恢复您的数据库。

此处将[Setup Database]节名设置为Config.ini文件中的值。

我正在使用initool.exe读取.ini文件中的键值,然后将键值存储在批处理文件中的变量中。

CALL .\INITOOL /f:".\Config.ini" /s:"Setup database" /k:"DBSERVER

注意:( . 指定当前目录/s是节名,/k是键值,/f是 initool.exe 所在的目录路径)在批处理文件中,将使用 FOR 循环进行循环,以从Config.ini文件读取键值并将其存储在批处理文件中的变量中。

示例:我正在使用for /f循环循环处理配置文件中的每个变量,此处指定的 Batch 文件中的tokens=*,将导致处理每行上的所有项。可以使用%variable Name%在 Batch 文件中访问每个变量。

master.dbo.sysdatabases :-Contains The information of The datbases that exists
                          in the Curent Dbserver Each dtabase is identified by Unique DBID
master.dbo.sysprocesses :-Contains information about the active server
                          process IDs (SPIDs) that are running on SQL Server.

步骤 1:在第一步中,我们将获取现有数据库的脚本,并将每个CREATEALTER语句与Sqlcmd Utility一起追加,如Batch File所示。

右键单击您的数据库 --> 脚本数据库 --> 创建到 --> 新建查询编辑器窗口

DBScripts

图 1 显示了如何从现有数据库获取数据库创建脚本。

步骤 2:在此步骤中,我们将从现有数据库(当前 DB)生成所有表、视图、存储过程和函数的脚本文件,并将.sql文件保存到Scripts文件夹中(例如:我已将文件保存为AllScripts.sql,其中包含C:\DBscripts\Scripts文件夹中的所有存储过程和视图。)

右键单击您的数据库 --> 任务 ---> 生成脚本

DBScripts

图 2 显示了如何获取数据库的所有脚本。

您可以使用Sqlcmd -i [input file]在命令提示符下执行Allscripts.sql(此步骤已在批处理文件中显示)。

步骤 3:运行脚本DataBaseেDiagramGenerator.sql(即位于 C:\DBScripts\Scripts),然后在需要备份图的数据库中运行,这将生成结果。复制粘贴并将结果文件保存为SQl DataBaseDiagram.sql,保存在同一个目录(即 C:\DBScripts\Scripts)。

在上面的脚本中,我正在使用 While 循环读取存储在我现有数据库的Sysdiagram表中的每个图。

数据库图存储在 SQL2005 的Sysdiagrams表中,而在 SQL2000 中存储在dtoProperties表中。我正在读取每个需要从现有数据库复制到新数据库的图。

您可以参考以下链接了解如何从当前数据库复制数据库图的详细信息。

DataBaseDiagramGenerator

步骤 4:将 Dbscripts 文件夹复制粘贴到加载了操作系统的驱动器中。在我的系统中,C 驱动器是我加载了操作系统的位置。因此,路径是 C:\DBscripts。

步骤 5:config.ini文件中将 Dbserver 名称更改为您现有的服务器名称,并且您可以指定要在所需目录中设置数据文件路径和日志文件路径(我已将我的路径指定为 C:\DBscripts\Data_LogPath)。

Config.ini文件中更改要创建的数据库的名称(例如:DATABASE=MyDataBase3)

步骤 6:通过在运行模式下键入命令cmd来打开命令提示符。



DBScripts

图 3

步骤 7:您将看到上面的命令提示符,键入 cd\,转到复制和存储 DBscripts 文件夹的驱动器。进入 Dbscripts 文件夹,然后在命令提示符下键入 SetupDb。

C -->Dbscripts -->SetupDb

DBScripts

图 4

然后,数据库将被恢复。

注意:您可以使用 OSql cmd Util 替换 Sqlcmd。OSql 不支持 -V 选项,而是可以使用 -r {0|1} 选项。

结论

现在,通过本文提供的概念,您可以将现有的数据库存储过程、视图、数据库图、表恢复到生产服务器,使您的数据库恢复过程使用批处理文件更加简单。

© . All rights reserved.