Press "Enter" to skip to content

日期: 2011 年 9 月 6 日

MSSQL2005-MSSQL2008数据库批量备份和还原脚本

由于项目关系,一台服务器数据库做迁移工作,将近两百多个数据库一个个备份要浪费很多时间,在此采用了生成脚本的方式与大家分享,希望给需要的人有帮助。已经测试适合MSSQL2005-MSSQL2008数据库备份和还原脚本,未测试MSSQL2000数据库。
2011-09-27 添加分离数据库和附加数据脚本

--批量生成分离脚本
use master
select 'EXEC sp_detach_db '''+name+''', ''true'';'  from sysdatabases 

--单个数据库分离
EXEC sp_detach_db '<database name>', 'true';
--批量生成数据库附加脚本
use master
select 'CREATE DATABASE ['+name+'] ON ( FILENAME = N''C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\'+name+'.mdf'' ),( FILENAME = N''C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\'+name+'_log.ldf'' ) FOR ATTACH ;' from sysdatabases 
--单个数据库附加脚本
use master
CREATE DATABASE [database_name] ON 
( FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\<database name>.mdf' ),
( FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\<database name>.ldf' )
 FOR ATTACH ;
use master
--生成批量删除数据库脚本
select 'DROP DATABASE  ['+name+'];' from sysdatabases 
use master
--生成备份脚本,可在列表中复制生成的TSQL代码
select 'BACKUP DATABASE ['+name+'] TO DISK = ''f:\autobak\'+name+'.bak'' WITH NOINIT , NOUNLOAD , NOSKIP , STATS = 10, NOFORMAT ;' from sysdatabases 

如图所示:

复制以上列表TSQL脚本在迁移的服务器上进行执行备份数据库

--生成还原脚本,数据库存放目录与迁移机器同样时用此脚本
select 'BACKUP DATABASE ['+name+'] FROM DISK=''f:\autobak\'+name+'.bak'' WITH REPLACE ;' from sysdatabases

select 'alter database ['+name+']  set online ;' from sysdatabases 

如图所示:

--数据库迁移到其他机器,盘符和目录发生变化时,就需要做还原配置相应的路径
--D:\Data 目录为数据库存放目录和日志存放目录,也可将两个目录分其他盘符可提升IO的操作效率
--注意:MOVE 后面的数据逻辑名称,如果是独立创建的数据逻辑名不会错。
--     假如是从A数据库还原成B名称数据时,他的逻辑名称还是A,所以此处大家一定要注意
select 'RESTORE DATABASE ['+name+'] FROM DISK=''d:\autobak\'+name+'.bak'' 
WITH MOVE ''' +name+ ''' TO ''d:\Data\'+name+'.mdf'',
MOVE '''+name+'_log'' TO ''d:\Data\'+name+'_log.ldf'';' from sysdatabases

生成以上脚本,可把数据库复制到部署机器上后,修改好bak文件所在目录执行TSQL脚本即可
有什么问题欢迎大家共同探讨,有不足之处或是有更好的方法希望大家能与我分享。

Leave a Comment

编写一个改变文件读写属性的C程序

编写一个改变文件读写属性的C程序

[root@kiccleaf leaf]# ll

-rwxr-xr-x  1 root root      5277 Aug  9 19:47 mysql.sh
#采用VIM编辑c源程序
[root@kiccleaf leaf]# vim chmd.c
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h> 
 
int main()
{
  if(chmod("./mysql.sh",S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)==0)
  {
    printf("设置成功!\n");
  }
  else
  {
    printf("设置失败!文件不存在!\n");
  }
  return 0;
}
#采用gcc编译生成chmd可执行文件
[root@kiccleaf leaf]# gcc -g -Wall -o chmd chmd.c

[root@kiccleaf leaf]# ./chmd
[root@kiccleaf leaf]# ll

-rw-r--r--  1 root root      5277 Aug  9 19:47 mysql.sh

文件显示“-rw-r–r–
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。

chmod()改变文档存取权限的函数

原形:int chmod(const char *path,int amode)

功能:根据amode的值,配置由path所指文档的存取权限。

amode的值     存取权限

S_IRUSR 用户可以读
S_IWUSR 用户可以写
S_IXUSR 用户可以执行
S_IRWXU 用户可以读写执行
———————————–
S_IRGRP 组可以读
S_IWGRP 组可以写
S_IXGRP 组可以执行
S_IRWXG 组可以读写执行
———————————–
S_IROTH 其他人可以读
S_IWOTH 其他人可以写
S_IXOTH 其他人可以执行
S_IRWXO 其他人可以读写执行
———————————–
S_ISUID 设置用户执行ID
S_ISGID 设置组的执行ID

———————————–
返回值:0(成功);-1(失败)

Leave a Comment