还原和备份数据库的脚本

时间:2022-05-04 08:49:16

对于我们这些经常要备份和还原数据库的人来说,MSSQL 2000的企业管理器运行的速度真是慢,而我们日常都使用查询分析器编写脚本,来回撤换很是不方便(MSSQL 2005就不一样了,两个加在一起,多爽啊还原和备份数据库的脚本),闲来编写了个备份和还原数据库的脚本,那就不用再打开企业管理器了.

--------------------------------------------------------------

--数据库还原

--------------------------------------------------------------


IF EXISTS (SELECT name FROM sysobjects
         WHERE name = 'restore_database_proc' AND type = 'P')
   DROP PROCEDURE restore_database_proc
GO

CREATE PROCEDURE restore_database_proc
@database_bak_path varchar(100)
AS

 exec( 'RESTORE FILELISTONLY FROM DISK = N''' + @database_bak_path + '''')

GO

DROP TABLE  #tmp_file
create table #tmp_file
(
 LogicalName nvarchar(128),  --文件的逻辑名称
 PhysicalName nvarchar(260),  --文件的物理名称或操作系统名称
 Type char(1),    --数据文件 (D) 或日志文件 (L)
 FileGroupName nvarchar(128),  --包含文件的文件组名称
 Size numeric(20,0),   --当前大小(以字节为单位)
 MaxSize numeric(20,0)   --允许的最大大小(以字节为单位)

)


--数据库的名字
declare @database_name varchar(1000)
--数据库备份文件的路径
declare @database_bak_path varchar(1000)
--数据库和日志存放文件
declare @database_path varchar(1000)
--数据库文件完整路径
declare @database_mdf_path varchar(1000)
--数据库日志完整路径
declare @database_log_path varchar(1000)

--数据库原来文件名字
declare @database_mdf_oldname varchar(1000)
--数据库日志原来文件名
declare @database_log_oldname varchar(1000)

--------------------------------------------------------------
/*需要修改的参数*/
--------------------------------------------------------------

--还原的数据库名
set @database_name = 'demo_db'
--数据库备份文件的完整路径
set @database_bak_path = 'F:/data_bak/demo_db.bak'
--数据库文件存放的路径
set @database_path = 'f:/data'

--------------------------------------------------------------
--------------------------------------------------------------

set @database_mdf_path =  @database_path + '/' + @database_name + '.mdf'
set @database_log_path =  @database_path + '/' + @database_name + '_Log.ldf'

 

INSERT INTO #tmp_file EXEC ('restore_database_proc N''' + @database_bak_path + '''')

set @database_mdf_oldname = (select LogicalName from #tmp_file where Type = 'D')
set @database_log_oldname = (select LogicalName from #tmp_file where Type = 'L')

exec(
'
RESTORE DATABASE ' + @database_name  +
'
FROM DISK = ''' + @database_bak_path + '''' +
'
WITH
MOVE ''' + @database_mdf_oldname + ''' TO ''' + @database_mdf_path + ''',' +
'
MOVE ''' + @database_log_oldname + ''' TO ''' + @database_log_path + ''''
)


--如果数据库是从7.0备份出来的话,可能还要执行下面的语句来updata一下
--这并不是必须的,但有系统说是会提高性能的,试试无妨啊~ ^O^

--EXEC(
--'USE '+ @database_name +
--'
--EXEC sp_updatestats '
--)  

 

--------------------------------------------------------------

--备份数据库

--------------------------------------------------------------

declare @database_name   varchar(1000)
declare @backup_file_name  varchar(1000)
declare @backup_path   varchar(1000)
declare @system_date  varchar(1000)


set @system_date = substring(CONVERT (varchar(1000),getdate(),21) ,1,10)
print @system_date

-------------------------------------------------------------
/*要自行修改的部分*/
/*备份文件名生成的格式为“数据库名”+“日期”*/

--要备份的数据库名
set @database_name  = 'demo_db'
--备份文件的路径
set @backup_path  = 'F:/data_bak'
-------------------------------------------------------------

--设置备份文件的名字
set @backup_file_name  = @database_name + '(' +@system_date + ').BAK'
set @backup_path  = @backup_path + '/' + @backup_file_name

create table #tmp_backup_info
(
 database_name  varchar(1000),
 backup_path varchar(1000)
)

insert into #tmp_backup_info
values(@database_name,@backup_path)

EXEC(
' USE MASTER'+
' EXEC sp_addumpdevice ''disk'', ''temp_backup_file'','  +
' ''' + @backup_path + '''' +
' BACKUP DATABASE ' + @database_name + ' TO temp_backup_file'
)

DROP TABLE #tmp_backup_info