`
k_lb
  • 浏览: 831703 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论
  • kitleer: 据我所知,国内有款ETL调度监控工具TaskCTL,支持ket ...
    kettle调度

SQL2005数据库 附加、分离、查询、备份、还原、删除 小程序

 
阅读更多

 SQL2005数据库 附加、分离、查询、备份、还原、删除 小程序
: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=saa
::----------------------------------------
::★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   [1]分离%AAA%数据库
Echo.        
Echo   [2]附加 %BBB% 下的%CCC%数据库文件    
Echo. 
Echo   [3]查看数据库中已存在的非系统表
Echo. 
Echo   [4]备份数据库%GGG%到 %HHH%\%III%
Echo. 
Echo   [5]还原" %JJJ% "数据库备份文件为%LLL%.mdf和%LLL%_log.ldf且存放到 %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=%Temp%\1.sql
Echo 正在清理与此数据库的连接,请等待……
::将下面的这句语句写到.sql文件里面,再通过下面的第二条语句调用执行这个.sql文件的内容,第三条语句是删除这个.sql文件,第四条语句开始分离
>"%XXX%" Echo alter database %AAA% set offline with rollback after 1;                                                                                 
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%下已经存在同名的数据库备份文件,而导致文件叠加到一块,这也算是SQL的一个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.bak'"
Echo.
Echo.
Echo 恭喜!恭喜!已成功将SQL中的数据库"%GGG%"备份成%HHH%下文件名为"%III%"的文件
Echo.
set CHS=0
pause
cls
goto dosmenu
::============================================================================
:5555
cls
Echo 数据库文件正在还原,在出现还原成功的提示前请您耐心等待……
set XXX=%Temp%\1.sql
Echo.
Echo.
>"%XXX%"   Echo DECLARE @bakFile nvarchar(1024);                      --定义@bakFile        
>>"%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 varchar(255), PhysicalName varchar(255),Type varchar(20), FileGroupName varchar(255), Size varchar(20), MaxSize varchar(20), Fileld VARCHAR(20), CreateLSN VARCHAR(20), DropLSN VARCHAR(20), Uniqueld uniqueidentifier, ReadOnlyLSN VARCHAR(20), ReadWriteLSN VARCHAR(20), BackupSizeInBytes VARCHAR(255), SourceBlockSize VARCHAR(20), FileGroupld VARCHAR(20), LogGroupGUID VARCHAR(20), DifferentialBaseLSN VARCHAR(20), DifferentialBaseGUID uniqueidentifier, IsReadOnly VARCHAR(20), IsPresent VARCHAR(20))        
>>"%XXX%" Echo    --建一个名叫#LogicalFileBak的新表,为什么要建这么多字段的理由见⑤和⑥
>>"%XXX%" Echo. 
>>"%XXX%" Echo INSERT #LogicalFileBak EXEC('RESTORE FILELISTONLY FROM DISK = ''' + @bakFile + '''');    --从备份文件中读取逻辑名并存到#LogicalFileBak表中           
>>"%XXX%" Echo. 
>>"%XXX%" Echo DECLARE cur CURSOR FOR SELECT LogicalName,Type,FileGroupName FROM #LogicalFileBak;    --定义一个游标cur(相当于数据集)并将搜索结果放到其中              
>>"%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 + '''';      --将这一串语句赋给@cmd             
>>"%XXX%" Echo SET @cmd = @cmd + ' WITH REPLACE'                                                      --接着将语句赋给@cmd             
>>"%XXX%" Echo. 
>>"%XXX%" Echo OPEN cur;                                --打开游标                                                           
>>"%XXX%" Echo FETCH NEXT FROM cur INTO @LogicalName,@Type,@FileGroupName;             --从这句往下的几句语句用来还原数据库 ,FETCH NEXT表示逐条读取游标中的数据                           
>>"%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;       --删除#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" (
Echo 正在删除,请等待……
::下面这两句用于清除连接
::>"%Temp%\1.sql" Echo alter database %MMM% set offline with rollback after 1;      
::Osql -U"%EEE%" -P"%FFF%" -i %XXX%
cls
::下面这句开始删除
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 库名"
del "%Temp%\1.sql"
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系统表中的name字段。
::可通过SELECT * FROM sysfiles语句查询本库的sysfiles表的字段,如下:
::fileid groupid     size      maxsize   growth status perf    name         filename
:: 1       1          66264       -1         2560     2         0      jx              D:\测试用数据\安吉\ForestFireControl_StandingBook.mdf
:: 2       0          1280         -1        2560      66       0     jx_log         D:\测试用数据\安吉\ForestFireControl_StandingBook_log.ldf
::④★===============================================================================================
::RESTORE FILELISTONLY 语句返回的结果集如果传递到参数呢?请高手指教。
::正常情况下,在查询分析器中   执行   
:: RESTORE   FILELISTONLY   From   disk   =   'path'   
:: 会返回一个结果集。例如:   
:: LogicalName         PhysicalName             Type   FileGroupName         Size        MaxSize     
:: -------------------------------------------------------------------------   
:: Northwind              C:\..\northwnd.mdf        D      PRIMARY               3407872     351843720   
:: Northwind_log       C:\..\northwnd.ldf           L       NULL                    1048576      351843720     
::⑤★================================================================================================
::MS sql server 2000,2005 如何取出restore filelistonly结果集
::            ---------------------------这是SQL SERVER 2000中的原形代码
::            use master
::            go
::            create table #restoreFileList (LogicalName varchar(255), PhysicalName varchar(255),Type varchar(20), FileGroupName varchar(255), Size varchar(20), MaxSize varchar(20) )
::            declare @filename varchar(1000)
::            select @filename = 'e:\svwlx.bak'
::            insert into #restoreFileList execute('restore filelistonly from disk='''+@filename+'''')
::            insert into #restoreFileList execute('restore filelistonly from disk=''e:\svwlx.bak''')
::            select * from #restoreFileList           
::            ---------------------------
::
::            ---------------------------这是SQL SERVER 2005中的原形代码
::            USE [master]
::            GO
::            create table #restoreFileList4 (LogicalName varchar(255), PhysicalName varchar(255),Type varchar(20), FileGroupName varchar(255), Size varchar(20), MaxSize varchar(20), Fileld VARCHAR(20), CreateLSN VARCHAR(20), DropLSN VARCHAR(20), Uniqueld uniqueidentifier, ReadOnlyLSN VARCHAR(20), ReadWriteLSN VARCHAR(20), BackupSizeInBytes VARCHAR(255), SourceBlockSize VARCHAR(20), FileGroupld VARCHAR(20), LogGroupGUID VARCHAR(20), DifferentialBaseLSN VARCHAR(20), DifferentialBaseGUID uniqueidentifier, IsReadOnly VARCHAR(20), IsPresent VARCHAR(20))
::            SELECT * FROM #restoreFileList4 
::            insert into #restoreFileList4 execute('restore filelistonly from disk=''d:\Northwind.bak''')
::            SELECT * FROM #restoreFileList4
::⑥★================================================================================================== 
::若5555中不添加这么多的字段,则会出现:列名或所提供值的数目与表定义不匹配   的错误
::原因是:
::比如:有个表A,有字段a,b,你在插入表纪录的时候写成
::insert A(a,b) values(xx,xx,xxx)
::表只有2个列,你写了3个值进去,就会出现你描述的错误信息,具体是哪问题,你根据你的环境去检查一下就知道了。


分享到:
评论

相关推荐

    数据库实验报告(修改,附加等)

    在这个"数据库实验报告"中,我们将深入探讨如何使用SQL Server Management Studio (SSMS) 来执行常见的数据库管理任务,包括创建、修改、分离、附加以及备份和还原数据库。 首先,创建数据库是数据库生命周期的起点...

    利用应用程序备份SQL Server数据策略的选择.pdf

    本文档标题为《利用应用程序备份SQL Server数据策略的选择》,主要针对程序员在实际工作中使用应用程序备份SQL Server数据库时面临的问题进行探讨,提出了多种备份策略并结合实例进行说明。 首先,备份策略的选择是...

    达梦数据库_SQL语言手册

    附加分离数据库 第章一致性和并发性 事务相关语句 事务的开始 事务的结束 保存点相关语句 设置事务隔离级及读写特性 手动上锁语句 第章存储模块 存储模块的定义 存储模块的删除 存储模块的控制语句 ...

    C# ASP.NET 模块 - 数据库备份与恢复模块

    本模块专注于“数据库备份与恢复”,涉及了SQL Server和Access两种常见数据库的处理,具体包括数据表的备份与还原、数据库的分离与附加等关键功能。以下将详细介绍这些知识点。 首先,**SQL Server数据表的备份与...

    SQL Server 2000数据库管理.ppt

    5. 分离和附加数据库:分离允许移动数据库文件,而后再通过附加将其重新连接到SQL Server实例。 此外,本章还会涉及表管理,包括创建表、修改表结构、添加和删除记录、表约束(如主键、外键、唯一性约束等)以及...

    SQL数据表提取器

    "SQL数据表提取器"是一个专门用于数据库管理的工具,其功能强大且全面,涵盖了数据库的多种操作,如附加、分离、备份、还原以及数据和表结构的导出。这个工具为IT专业人员提供了便捷的方式来管理和处理SQL数据库,极...

    sql server 应用与开发

    10. **备份和还原数据库**:`sp_addumpdevice`创建备份设备,`BACKUP DATABASE`进行数据库备份,而`RESTORE DATABASE`则用于恢复备份。 11. **查询操作**:`SELECT`语句是SQL的核心,用于检索数据,如查询特定列、...

    SQL Server 2008管理员必备指南(超高清PDF)Part3

    7.6.3 附加和分离数据库 7.7 提示和技巧 7.7.1 复制和移动数据库 7.7.2 移动数据库 7.7.3 移动tempdb和改变tempdb的大小 7.7.4 创建辅助数据和日志文件 7.7.5 防止事务日志错误 7.7.6 防止文件组充满的错误 7.7.7 ...

    SQL Server 2005 从入门到精通

    本章主要介绍了在SQL Server 2005中如何选择合适的存储方式来保存应用程序的数据。通过以下几个方面进行了详细的阐述: - **1.1 在哪里存储应用程序设置** - 讨论了应用程序配置数据的存储位置。通常情况下,这些...

    SQL Server 2008管理员必备指南(超高清PDF)Part1

    7.6.3 附加和分离数据库 7.7 提示和技巧 7.7.1 复制和移动数据库 7.7.2 移动数据库 7.7.3 移动tempdb和改变tempdb的大小 7.7.4 创建辅助数据和日志文件 7.7.5 防止事务日志错误 7.7.6 防止文件组充满的错误 7.7.7 ...

    SQL Server 2008管理员必备指南(超高清PDF)Part2

    7.6.3 附加和分离数据库 7.7 提示和技巧 7.7.1 复制和移动数据库 7.7.2 移动数据库 7.7.3 移动tempdb和改变tempdb的大小 7.7.4 创建辅助数据和日志文件 7.7.5 防止事务日志错误 7.7.6 防止文件组充满的错误 7.7.7 ...

    SQL.Server.2008管理员必备指南.part4.rar(4/4)

     7.6.3 附加和分离数据库 193  7.7 提示和技巧 195  7.7.1 复制和移动数据库 195  7.7.2 移动数据库 199  7.7.3 移动tempdb和改变tempdb的大小 200  7.7.4 创建辅助数据和日志文件 201  7.7.5 防止事务日志...

    SQL.Server.2008管理员必备指南.part2.rar(2/4)

     7.6.3 附加和分离数据库 193  7.7 提示和技巧 195  7.7.1 复制和移动数据库 195  7.7.2 移动数据库 199  7.7.3 移动tempdb和改变tempdb的大小 200  7.7.4 创建辅助数据和日志文件 201  7.7.5 防止事务日志...

    SQLServer2000基础教程.doc

    - **分离数据库**:分离数据库是指将数据库文件从SQL Server实例中移除,但不删除这些文件。分离数据库后,可以通过复制MDF和LDF文件来实现数据库的备份。在备份之前必须先分离数据库,否则无法直接复制这些文件。 -...

    SQL.Server.2008管理员必备指南.part1.rar(1/4)

     7.6.3 附加和分离数据库 193  7.7 提示和技巧 195  7.7.1 复制和移动数据库 195  7.7.2 移动数据库 199  7.7.3 移动tempdb和改变tempdb的大小 200  7.7.4 创建辅助数据和日志文件 201  7.7.5 防止事务日志...

    SQL.Server.2008管理员必备指南.part3.rar(3/4)

     7.6.3 附加和分离数据库 193  7.7 提示和技巧 195  7.7.1 复制和移动数据库 195  7.7.2 移动数据库 199  7.7.3 移动tempdb和改变tempdb的大小 200  7.7.4 创建辅助数据和日志文件 201  7.7.5 防止事务日志...

    sql2008系统存储过程

    - 用于将已分离的数据库重新附加到SQL Server实例。 - 语法示例:`EXEC sp_attach_db @dbname = N'TestDB', @filename1 = N'D:\Data\TestDB.mdf'` 13. **sp_renamedb** - 更改数据库名称 - 用于更改现有数据库的...

Global site tag (gtag.js) - Google Analytics