`
kayo
  • 浏览: 557947 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

bat批处理 SQL2000数据库附加、分离、查询、备份、还原、删除小程序

阅读更多

@Echo off
::本程序在XP环境下对SQL2000 数据库测试通过

::SQL2005的见 http://hi.baidu.com/yjjjjs/blog/item/7236891afe0be4f6ae513360.html

Title SQL2000数据库 附加、分离、查询、备份、还原、删除 小程序
:dosmenu

::▇AAA代表在SQL中看到的[要分离、附加的数据库名]
::▇BBB代表[要附加的数据库的位置]            CCC代表[要附加的数据库文件名]            DDD代表[要附加的数据库日志文件名]
::▇EEE代表[指定的数据库实例用户名]          FFF代表[指定的数据库实例用户的密码] (这里指定的实例是"127.0.0.1"或"Local"或"."即指本机SQL自带的实例)
::▇GGG代表[要备份的数据库名]                HHH代表[数据库备份的路径]                III代表[备份后的名字]
::▇JJJ代表[用于还原的数据库备份文件所在的路径+文件名]   KKK代表[还原后的数据库文件所存放的路径]   LLL代表[还原数据库后在SQL中所显示的名称]
::▇MMM代表[要删除的数据库名]
::#**********************************************************************#
::★1、【分离】请编辑AAA
set AAA=ForestFireControl_StandingBook
::----------------------------------------
::★2、【附加】请编辑AAA、BBB、CCC、DDD
set BBB=C:\
set CCC=ForestFireControl_StandingBook.mdf
set DDD=ForestFireControl_StandingBook_log.ldf
::----------------------------------------
::★设定数据库的登入【账号和密码】请编辑EEE、FFF
set EEE=sa
set FFF=sa
::----------------------------------------
::★4、【备份】请编辑GGG、HHH、III
set GGG=ForestFireControl_StandingBook
set HHH=C:\
set III=备份的数据库2.bak
::----------------------------------------
::★5、【还原】请编辑JJJ、KKK、LLL
set JJJ=C:\备份的数据库2.bak
set KKK=C:\
set LLL=ForestFireControl_StandingBook
::----------------------------------------
::★6、【删除】请编辑MMM
set MMM=ForestFireControl_StandingBook
::#**********************************************************************#
REM 选择菜单

Echo ★★★注意:本文件最好不要放在路径名中含有空格的位置上运行(如桌面等位置)    
Echo #**********************************************************************#
Echo              选项如下(可用记事本打开对相应参数重新编辑)
Echo #**********************************************************************#
Echo.
Echo   [1]分离%AAA%数据库
Echo.       
Echo   [2]附加%BBB%下的%CCC%数据库文件   
Echo.
Echo   [3]查看数据库中已存在的非系统表
Echo.
Echo   [4]备份数据库%GGG%到%HHH%%III%
Echo.
Echo   [5]还原"%JJJ%"数据库备份文件为%LLL%.mdf且存放到%KKK%下
Echo.
Echo   [6]彻底删除数据库%MMM%
Echo.
Echo       退出请按其他键
Echo.
Echo #**********************************************************************#
Echo 选择后请按回车进行确认
Echo.
set /P CHS=请选择: [1],[2],[3],[4],[6]?

if /I "%CHS%"=="1" goto 1111
if /I "%CHS%"=="2" goto 2222
if /I "%CHS%"=="3" goto 3333
if /I "%CHS%"=="4" goto 4444
if /I "%CHS%"=="5" goto 5555
if /I "%CHS%"=="6" goto 6666
goto zzzz
::============================================================================
:1111
cls
set XXX=C:\121.sql
Echo 正在清理与此数据库的连接,请等待……
::将下面的这三句语句写到.sql文件里面,再通过下面的第四条语句调用执行这个.sql文件的内容,第五条语句是删除这个.sql文件,第六条语句开始分离
>"%XXX%" Echo use   master                                                                                                   
>>"%XXX%" Echo declare hcforeach cursor global for select 'kill '+rtrim(spid) from sysprocesses where dbid=db_id(N'%AAA%')     
>>"%XXX%" Echo exec   sp_msforeach_worker   '?'                                                                                
Osql -U"%EEE%" -P"%FFF%" -i %XXX%
del %XXX%
OSQL -E -Q "SP_DETACH_DB %AAA%"
::其他例子: osql -U"sa" -P"sa" -S"127.0.0.1" -Q "sp_detach_db '库名'"
Echo.
Echo.
Echo 分离SQL中名为%AAA%的数据库成功
Echo.
set CHS=0
pause
cls
goto dosmenu
::============================================================================
:2222
cls
OSQL -U"%EEE%" -P"%FFF%" -S"127.0.0.1" -Q "sp_attach_db '%AAA%','%BBB%\%CCC%','%BBB%\%DDD%'"
Echo.
Echo.
Echo 附加%BBB%下的数据库文件%CCC%到SQL中成功
Echo.
::★★★ OSQL -U"sa" -P"sa" -S"127.0.0.1" -Q "sp_attach_db '库名','路径\数据文件名','路径\日志文件名'"
set CHS=0
pause
cls
goto dosmenu
::============================================================================
:3333
cls
OSQL -E -Q "SELECT NAME,FILENAME FROM MASTER..SYSDATABASES WHERE name<>'master' and name<>'tempdb' and name<>'model' and name<>'msdb' "
::★★★上面语句中FROM后面的MASTER..SYSDATABASES表示系统自带的MASTER数据库中的SYSDATABASES表
set CHS=0
pause
cls
goto dosmenu
::============================================================================
:4444
cls
del %HHH%%III%
cls
::加上述的del %HHH%%III%语句的作用是为了防止在路径%III%下已经存在同名的数据库备份文件,而导致文件叠加到一块,这也算是SQL2000的一个Bug
Echo 正在备份数据库,在出现成功的提示之前请您耐心等待……
Echo.
Echo.
OSQL -U"%EEE%" -P"%FFF%" -S"127.0.0.1" -d"%GGG%"   -Q "Backup DataBase %GGG% to disk = '%HHH%%III%'"
::★★★OSQL -U"sa" -P"sa" -S"127.0.0.1" -d"CircleImage" -Q "Backup DataBase CircleImage to disk = 'c:\111.db'"
Echo.
Echo.
Echo 恭喜!恭喜!已成功将SQL中的数据库"%GGG%"备份成%HHH%下文件名为"%III%"的文件
Echo.
set CHS=0
pause
cls
goto dosmenu
::============================================================================
:5555
cls
Echo 数据库文件正在还原,在出现还原成功的提示前请您耐心等待……
set XXX=C:\123.sql

>"%XXX%"   Echo DECLARE @bakFile nvarchar(1024);                               
>>"%XXX%" Echo SET @bakFile = N'%JJJ%';                                      
>>"%XXX%" Echo.                               
>>"%XXX%" Echo DECLARE @restorePath nvarchar(1024);                           
>>"%XXX%" Echo SET @restorePath = N'%KKK%';                                  
>>"%XXX%" Echo.
>>"%XXX%" Echo DECLARE @dbname nvarchar(128);                                 
>>"%XXX%" Echo SET @dbname = N'%LLL%';                                       
>>"%XXX%" Echo.
>>"%XXX%" Echo DECLARE @filename nvarchar(128);                              
>>"%XXX%" Echo SET @filename = @dbname;                                      
>>"%XXX%" Echo.
>>"%XXX%" Echo CREATE TABLE #LogicalFileBak(LogicalName nvarchar(128),        
>>"%XXX%" Echo                                 PhysicalName nvarchar(260),       
>>"%XXX%" Echo                                 Type char(1),                     
>>"%XXX%" Echo                                 FileGroupName nvarchar(128),      
>>"%XXX%" Echo                                 [Size] numeric(20,0),             
>>"%XXX%" Echo                                 [MaxSize] numeric(20,0) );       
>>"%XXX%" Echo.
>>"%XXX%" Echo   INSERT #LogicalFileBak EXEC('RESTORE FILELISTONLY FROM DISK = ''' + @bakFile + '''');              
>>"%XXX%" Echo.
>>"%XXX%" Echo   DECLARE cur CURSOR FOR SELECT LogicalName,Type,FileGroupName FROM #LogicalFileBak;                
>>"%XXX%" Echo   DECLARE @LogicalName nvarchar(128),@Type char(1),@FileGroupName nvarchar(128);                     
>>"%XXX%" Echo.
>>"%XXX%" Echo   DECLARE @cmd nvarchar(4000);                                                                       
>>"%XXX%" Echo   SET @cmd = 'RESTORE DATABASE [' + @dbname + '] FROM DISK = ''' + @bakFile + '''';                  
>>"%XXX%" Echo   SET @cmd = @cmd + ' WITH REPLACE'                                                                  
>>"%XXX%" Echo.
>>"%XXX%" Echo   OPEN cur;                                                                                         
>>"%XXX%" Echo   FETCH NEXT FROM cur INTO @LogicalName,@Type,@FileGroupName;                                       
>>"%XXX%" Echo   WHILE @@FETCH_STATUS = 0                                                                           
>>"%XXX%" Echo        BEGIN                                                                                         
>>"%XXX%" Echo             SET @cmd = @cmd + ',MOVE ''' + @LogicalName + ''' TO ''' + @restorePath                   
>>"%XXX%" Echo                             + @filename + CASE WHEN @Type = 'D' AND @FileGroupName = 'PRIMARY'        
>>"%XXX%" Echo                                                    THEN '.mdf'                                        
>>"%XXX%" Echo                                                WHEN @Type = 'D' AND @FileGroupName ^<^> 'PRIMARY'     
>>"%XXX%" Echo                                                    THEN '.ndf'                                       
>>"%XXX%" Echo                                                ELSE '_log.ldf'                                      
>>"%XXX%" Echo                                                END + ''''                                         
>>"%XXX%" Echo             FETCH NEXT FROM cur INTO @LogicalName,@Type,@FileGroupName;                            
>>"%XXX%" Echo        END                                                                                           
>>"%XXX%" Echo   CLOSE cur;                                                                                      
>>"%XXX%" Echo   DEALLOCATE cur;                                                                                   
>>"%XXX%" Echo.
>>"%XXX%" Echo   EXEC(@cmd);                                                                                        
>>"%XXX%" Echo.
>>"%XXX%" Echo   DROP TABLE #LogicalFileBak;                                                                        

Osql -U"%EEE%" -P"%FFF%" -i %XXX%
del %XXX%

Echo.
Echo.
Echo 恭喜!已成功将"%JJJ%"还原成%LLL%,且还原后的文件存放在%KKK%下
Echo.
pause
set CHS=0
cls
goto dosmenu
::============================================================================
:6666
Echo 真的要删除吗?删除后将不可恢复
Echo.
set /P QR=确定删除请按y,放弃删除请按其他键,请选择?
cls
if /I "%QR%"=="y" (
OSQL -U"%EEE%" -P"%FFF%" -S"127.0.0.1" -Q "Drop DataBase %MMM%"
::其他例子:OSQL -U"sa" -P"sa" -S"127.0.0.1" -Q "Drop DataBase 库名"
Echo.
Echo 删除SQL中名为%AAA%的数据库及源文件成功
Echo.
pause
)
set QR=0
set CHS=0
cls
goto dosmenu
::============================================================================
:zzzz
REM 退出
exit


::**************************************************************************************************
::**************************************************************************************************
::**************************************************************************************************
::分离数据库的命令:Sp_detach_db 数据库名
::  连接数据库的命令:Sp_attach_db或者sp_attach_single_file_db
::  sp_attach_db [@dbname =] 'dbname', [@filename1 =] 'filename_n' [,...16]
::  sp_attach_single_file_db [@dbname =] 'dbname', [@physname =] 'physical_name'
::
::使用此方法可以正确附加和分离SQL Sever7.0和SQL Server 2000的数据库文件,要点是备份的时候一定要将mdf和ldf两个文件都备份下来,mdf文件是数据库数据文件,ldf是日志文件。


::OSQL -? 显示帮助(具体如下所示)
::用法: osql [-U 登录 ID] [-P 密码]
::[-S 服务器] [-H 主机名] [-E 可信连接]
::[-d 使用数据库名称] [-l 登录超时值] [-t 查询超时值]
::[-h 标题] [-s 列分隔符] [-w 列宽]
::[-a 数据包大小] [-e 回显输入] [-I 允许带引号的标识符]
::[-L 列出服务器] [-c 命令结束] [-D ODBC DSN 名称]
::[-q "命令行查询"] [-Q "命令行查询" 并退出]
::[-n 删除编号方式] [-m 错误级别]
::[-r 发送到 stderr 的消息] [-V 严重级别]
::[-i 输入文件] [-o 输出文件]
::[-p 打印统计信息] [-b 出错时中止批处理]


::★★★可通过下面的语句查询已有备份库的逻辑文件名,以用于 还原数据库语句操作 中的操作
::OSQL -U"sa" -P"sa" -S"127.0.0.1"   -Q "restore filelistonly from disk ='C:\备份的数据库1'"
::
::OSQL -U"sa" -P"sa" -S"127.0.0.1"   -Q "restore filelistonly from disk ='C:\备份的数据库1'" >>C:\1234.txt

::=============================================================================================
::★★★★★ 还原数据库语句操作
::其中的 数据库的逻辑文件名 和 数据库日志的逻辑文件名 是通过上述的语句来查询的

::格式说明:
::osql -E -d CircleImage -Q "restore database 备份后SQL中看到的数据库名 from disk='用于还原的备份文件的路径+文件名' with move '数据库的逻辑文件名' TO '备份后的路径+实际文件名', MOVE '数据库日志的逻辑文件名' TO '备份后的路径+实际文件名'"

::实例:
::OSQL -U"sa" -P"sa" -S"127.0.0.1" -Q "restore database CircleImage from disk='C:\CircleImage备份' with move 'CircleImage_Data' to 'c:\CircleImage.mdf',move ::'CircleImage_Log' to 'c:\CircleImage_log.ldf'"

::上述这么长的语句中切不可出现回车等换行符,且参数的大小写是不可随意更改的

::=============================================================================================
::★★ 更改数据库备份文件逻辑名的方法:

::alter database 数据库名 modify file (name=逻辑名,newname=新逻辑名)

::事实上,上面的语句是更改了sysfiles和sysfiles1系统表中的name字段。

分享到:
评论

相关推荐

    批处理(bat)实现SQLServer数据库备份与还原

    ### 批处理(BAT)实现SQL Server数据库备份与还原 #### 一、概述 在日常的数据库维护工作中,定期对数据库进行备份是非常重要的一个环节,它能够帮助我们防止因硬件故障、软件错误或其他不可预见的情况导致的数据...

    使用批处理实现数据库的备份和还原

    使用批处理实现数据库的备份和还原 数据库备份和还原是数据库管理的重要环节,使用批处理可以实现数据库的自动备份和还原。下面将详细介绍使用批处理实现数据库的备份和还原的步骤和知识点。 一、创建.sql 文件 ...

    oracle利用批处理文件执行SQL语句,bat连接oracle数据库并执行语句

    批处理文件(如.bat文件)在Windows环境中是一种高效的方式,可以自动化执行一系列命令,包括连接数据库和执行SQL语句。在这个场景中,我们可以利用批处理文件来简化Oracle数据库的操作,如删除用户、创建用户、创建...

    BAT批处理脚本-提示窗口进度条-17个.zip

    BAT批处理脚本-WinXP相关批处理-12个 BAT批处理脚本-加密解密-22个 BAT批处理脚本-实用的批处理文件-70个 BAT批处理脚本-提示窗口...BAT批处理脚本-系统设置查询修改-硬件相关-139个 BAT批处理脚本-网络相关操作-44个

    任务计划+批处理实现Oracle数据库的定时备份

    在Oracle数据库备份中,批处理文件通常包含SQL*Plus命令和操作系统命令。以下是一个简单的Oracle数据库备份批处理文件(DYHX_SYS_bak.bat)示例: ```batch @echo off set ORACLE_HOME=C:\Oracle\product\11.2.0\...

    SQL Server自动备份脚本 bat

    "SQL Server自动备份脚本 bat" 提供了一种自动化解决方案,确保你可以按照预定的时间表执行数据库备份。下面将详细介绍如何利用SQL Server的T-SQL命令以及批处理(bat)文件来创建一个定时备份策略。 首先,`...

    bat批处理运行sql文件

    bat批处理运行sql文件,

    批处理备份mysql数据库

    标题中的“批处理备份mysql数据库”是指通过编写批处理脚本(.bat文件)来自动化MySQL数据库的备份过程。批处理是一种基于DOS或Windows操作系统中的命令行接口,可以预先定义一系列命令并一次性执行,大大提高了工作...

    MySql 数据库备份批处理,.bat脚本,Windows任务计划调用执行的

    附件为两个.bat脚本文件,用于在Windows下备份MySQL数据库,一个是备份数据库文件,另一个是将数据库导出sql脚本。需要自己修改数据库名称,备份到sql脚本的,需要自己手动创建好路径文件夹。这两个批处理文件都是...

    sqlserver 数据库的备份与还原

    ### SQL Server数据库的备份与还原知识点详解 #### 一、SQL Server数据库备份的重要性 SQL Server作为一款广泛使用的数据库管理系统,在企业级应用中扮演着至关重要的角色。为了确保数据的安全性和完整性,定期对...

    BAT批处理脚本-系统设置查询修改-硬件相关-139个.zip

    BAT批处理脚本-WinXP相关批处理-12个 BAT批处理脚本-加密解密-22个 BAT批处理脚本-实用的批处理文件-70个 BAT批处理脚本-提示窗口...BAT批处理脚本-系统设置查询修改-硬件相关-139个 BAT批处理脚本-网络相关操作-44个

    windows计划任务+批处理命令实现oracle数据库的自动备份.txt

    本文将深入探讨如何利用Windows计划任务与批处理命令实现Oracle数据库的自动备份,这是一个结合了操作系统自动化工具与数据库管理技术的高级应用案例。 ### 一、理解Windows计划任务 Windows计划任务是一个强大的...

    Sql Server数据库跨计算机自动备份批处理脚本

    "Sql Server数据库跨计算机自动备份批处理脚本"是一个解决方案,它允许管理员实现自动化、远程的数据库备份过程,从而提高效率并确保数据的安全性。下面将详细阐述这个主题中的几个关键知识点。 1. **SQL Server ...

    oracle数据库备份还原BAT脚本

    "Oracle数据库备份还原BAT脚本"就是这样一个工具,它允许用户通过简单的脚本配置进行数据库的备份操作,并且可以设定为Windows计划任务以实现定时备份。 首先,我们需要理解BAT脚本的基本结构。在批处理文件中,...

    Mysql数据库备份批处理

    Mysql数据库备份批处理Mysql数据库备份批处理Mysql数据库备份批处理Mysql数据库备份批处理

    BAT批处理脚本-WinXP相关批处理-12个.zip

    BAT批处理脚本-WinXP相关批处理-12个 BAT批处理脚本-加密解密-22个 BAT批处理脚本-实用的批处理文件-70个 BAT批处理脚本-提示窗口...BAT批处理脚本-系统设置查询修改-硬件相关-139个 BAT批处理脚本-网络相关操作-44个

    BAT批处理脚本-文件相关操作-92个.zip

    BAT批处理脚本-WinXP相关批处理-12个 BAT批处理脚本-加密解密-22个 BAT批处理脚本-实用的批处理文件-70个 BAT批处理脚本-提示窗口...BAT批处理脚本-系统设置查询修改-硬件相关-139个 BAT批处理脚本-网络相关操作-44个

    bat/cmd批处理连接SqlServer数据库查询脚本

    在本文中,作者介绍了一种利用Windows批处理(bat/cmd)脚本来连接SqlServer数据库执行查询的方法。批处理脚本是一种传统的自动化脚本语言,常用于Windows操作系统中批量执行命令。SqlServer是微软公司开发的一个...

    BAT批处理脚本-实用的批处理文件-70个.zip

    BAT批处理脚本-WinXP相关批处理-12个 BAT批处理脚本-加密解密-22个 BAT批处理脚本-实用的批处理文件-70个 BAT批处理脚本-提示窗口...BAT批处理脚本-系统设置查询修改-硬件相关-139个 BAT批处理脚本-网络相关操作-44个

Global site tag (gtag.js) - Google Analytics