sql 作业+游标 自动备份数据库
前言
昨天有个同事在客户的服务器上面弄数据库,不小心执行了一条 sql 语句
TRUNCATE TABLE xxx
碉堡了吧,数据全没了 - - ,然后就是在网上拼命的搜索关于数据恢复的软件,搞了一下午还是回不来了。
需求来了
后面老大就让我写一个作业每天备份一次数据库,且只需要备份一些重要的表。
如何实现
作业肯定不是难点,难点是怎么把需要的表的数据拿出来存放到新的数据库中。
我首先就想到了sql中的导出数据功能,结果是可行的,可问题来了那个是使用工具导出的,用sql语句咋写了,反正我是不会,有谁会的告诉一下哈。
后面在百度谷歌上找啊找啊,找到了个bcp
EXEC 数据库名..xp_cmdshell 'bcp 表名 out 文件路径 -c -T -U''账号'' -P''密码'''
结果发现这个只能导出文件,像txt,xls,csv等一些,不是我想要的mdf啊。(可能是我不会用落)
最终解决的方法
select * into [备份的数据库].dbo.表名 from [原数据库].dbo.表名
意思是往[备份的数据库]里增加一个表,表结构与数据都从[原数据库]的表中复制(反正我是这么理解的 - -)
总体思路及代码
1 新建数据库
数据库名我是根据原始数据库名加上当前日期命名的 testdb_bak_年_月_日
创建数据库的代码
declare @fromDataBaseName nvarchar(50) --原数据库名称
set @fromDataBaseName='testdb'
declare @errorCount int --错误数
declare @yearMonthDay nvarchar(50) --年_月_日
select @yearMonthDay=Datename(year,GetDate())+'_'+Datename(month,GetDate())+'_'+Datename(day,GetDate())
declare @baseName nvarchar(50)--数据库名称
set @baseName=@fromDataBaseName + '_bak_' + @yearMonthDay --数据库名称为 gpsdb_bak_xx_xx_xx declare @createBase nvarchar(500) --创建数据库用的sql语句
set @createBase='create database [' + @baseName + ']
on primary(name=['+ @baseName + '_Data],filename=''D:\GpsdbBak\' + @baseName + '_Data.mdf'',size=5mb,maxsize=100mb, filegrowth=15%)
log on(name=['+ @baseName + '_log],filename=''D:\GpsdbBak\' + @baseName + '_log.ldf'',size=2mb,filegrowth=1mb)'
print @createBase
exec (@createBase) --执行创建数据库
set @errorCount=@@ERROR
2 获取原数据库中经过刷选的表然后复制到上面新建的表中
获取原数据库中所有的表名,sql 语句如下
use [testdb]
select name from sysobjects where type = 'U' and --获取所有表名
(CHARINDEX('gps_position_',name)=0 and --带有这个的表不要
CHARINDEX('buf',name)=0 and --临时表不要
name <> 'gps_log') --日志表不要
ORDER BY Name
3 游标
得到了所有表之后肯定就是最后的关键步骤,复制表到新数据库,这里我是用游标实现的。
use [testdb]
declare test_Cursor cursor local for --定义一个游标 select name from sysobjects where type = 'U' and --获取所有表名
(CHARINDEX('gps_position_',name)=0 and --带有这个的表不要
CHARINDEX('buf',name)=0 and --临时表不要
name <> 'gps_log') --日志表不要
ORDER BY Name open test_Cursor--打开游标
declare @table_name nvarchar(50)
fetch next from test_Cursor into @table_name
while @@FETCH_STATUS=0
begin
if(@table_name<>'')
begin
exec ('select * into [' + @baseName +'].dbo.' + @table_name +' from ['+ @fromDataBaseName +'].dbo.' + @table_name) --关键的一语句代码
fetch next from test_Cursor into @table_name
end
close test_Cursor
DEALLOCATE test_Cursor
完整代码
/*
备份数据脚本,将@fromDataBaseName(原数据库备份到@baseName数据库中)
需注意的地方
1:需要在D盘建立一个名为GpsdbBak的文件夹
2:需要根据实际情况给fromDataBaseName变量赋值
3:找到use 修改use后面的数据库名称为实际情况下的
*/
declare @fromDataBaseName nvarchar(50) --原数据库名称
set @fromDataBaseName='testdb'
declare @errorCount int --错误数
declare @yearMonthDay nvarchar(50) --年_月_日
select @yearMonthDay=Datename(year,GetDate())+'_'+Datename(month,GetDate())+'_'+Datename(day,GetDate())
declare @baseName nvarchar(50)--数据库名称
set @baseName=@fromDataBaseName + '_bak_' + @yearMonthDay --数据库名称为 gpsdb_bak_xx_xx_xx declare @createBase nvarchar(500) --创建数据库用的sql语句
set @createBase='create database [' + @baseName + ']
on primary(name=['+ @baseName + '_Data],filename=''D:\GpsdbBak\' + @baseName + '_Data.mdf'',size=5mb,maxsize=100mb, filegrowth=15%)
log on(name=['+ @baseName + '_log],filename=''D:\GpsdbBak\' + @baseName + '_log.ldf'',size=2mb,filegrowth=1mb)'
print @createBase
exec (@createBase) --执行创建数据库
set @errorCount=@@ERROR
if(@errorCount=0)
begin
use [testdb]
declare test_Cursor cursor local for --定义一个游标
select name from sysobjects where type = 'U' and --获取所有表名
(CHARINDEX('gps_position_',name)=0 and --带有这个的表不要
CHARINDEX('buf',name)=0 and --临时表不要
name <> 'gps_log') --日志表不要
ORDER BY Name
open test_Cursor--打开游标
declare @table_name nvarchar(50)
fetch next from test_Cursor into @table_name
while @@FETCH_STATUS=0
begin
if(@table_name<>'')
begin
exec ('select * into [' + @baseName +'].dbo.' + @table_name +' from ['+ @fromDataBaseName +'].dbo.' + @table_name) --关键的一语句代码
fetch next from test_Cursor into @table_name
end
close test_Cursor
DEALLOCATE test_Cursor
end
待完善的问题
不知道同学们发现没有,如果想换需要备份的数据库,则需要改两个地方,注释说明那里的2,3点,这两个其实都是同一个数据库名,下面的那个 use testdb,不知道能不能像执行sql语句一样 exec ('use testdb'),如果可以的话那就换数据库的话改下 set @fromDataBaseName='testdb' 这句就O了。
作业
接下来就是放到作业里面去了,这个直接上图了。
1

2

3


4


最后面就O了。
sql 作业+游标 自动备份数据库的更多相关文章
- SQL Server 定时自动备份数据库
在SQL Server中出于数据安全的考虑,所以需要定期的备份数据库,这篇文章介绍使用SQL Server 数据库代理中的作业定时自动备份数据库. 1.启动SQL Server代理服务,如下图: 绿色 ...
- SQL Server 2008、SQL Server 2008R2 自动备份数据库
让SQL Server 2008自动备份数据库,需要建立一个SQL Server作业,并启动SQL Server代理,使该作业定期运行. 具体来说,可以按以下步骤进行: 一.打开SQL Server ...
- SQL Server 2008自动备份数据库
1.在电脑开始菜单中选择“SQL Server Management Studio”双击.在出现的界面中点击“连接”按钮. 2.在出现的“ Microsoft SQL Server Managemen ...
- SQL SERVER 设置自动备份和删除旧的数据库文件
打开SQL SERVER MANAGEMENT STUDIO,启动SQL SERVER代理服务(注意在“控制面板-管理工具-服务”中设置SQL SERVER AGENT的启动类型为自动).启动后点击“ ...
- Sql Server自动备份数据库,定期删除备份
//实现:每天自动备份数据库,定期删除备份 //步骤:[开始]--[所有程序]--[Microsoft SQL Server 2005]--[SQL Server Management Studio] ...
- SQL SERVER 2012设置自动备份数据库
为了防止数据丢失,这里给大家介绍SQL SERVER2012数据自动备份的方法: 一.打开SQL SERVER 2012,如图所示: 服务器类型:数据库引擎: 服务器名称:127.0.0.1(本地), ...
- SQLServer2005利用维护计划自动备份数据库
经常性忘了给数据库备份,结果当数据库发生问题的时候,才发现备份是1个月以前的,那个后悔与懊恼还加惭愧啊,别提有对难受了.要认为的记住去备份比较难,每天事情又那么多,所以有了这个自动备份就不用愁了.先拷 ...
- MSSQL Express版本自动备份数据库
由于Express版本的数据库没有自动备份数据库的功能,所以需要自己搭建好备份功能 一.具体原理: 1.利用SQL备份命令:Backup Database 2.使用sqlcmd执行备份命令 3.使用系 ...
- CentOS下使用crontab+mysqldump实现定时自动备份数据库
一 : 为什么要进行数据库的备份? 最主要的原因:尽可能地减少损失,包括时间上.精神上和金钱上的损失.很多人都不注意备份数据,以致在发生问题后丢失大量的重要数据.要知道,在地球上网是很危险的,即使做好 ...
随机推荐
- 如何用python语句获得Python的安装目录
官方文档上有写的,sys.executable是当前Python解释器(或者其他Python实现)的路径去掉后面一个路径分隔符(Windows下是'\')后的部分即可 >>>impo ...
- Hadoop 新 MapReduce 框架 Yarn 详解
Hadoop 新 MapReduce 框架 Yarn 详解: http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/ Ap ...
- 【转】XCode、Cocoa、Objective-C 的关系区别
原文网址:http://blog.sina.com.cn/s/blog_5e89e1ff0100z4k1.html Object-Ciphone开发用的编程语言不是c,c++,java 而是objec ...
- Camus导入中文乱码问题(源码修改、编译、部署、任务启动)
Camus使用过程中业务方反映从Kafka导入至HDFS中的数据有中文乱码问题,且业务方确认写入的数据编码为UTF-8,开始跟进. 问题重现: (1)编写代码将带有中文的字符串以编码UTF-8 ...
- 计算1到n整数中,字符ch出现的次数
个位ch个数 + 十位ch个数 * 10 + 百位ch个数 * 100:同时如果某一位刚好等于ch,还需要减去多算的一部分值. #include <stdio.h> //整数1到n,字符c ...
- 青云QingCloud业内率先支持云端全面透明代理功能 | SDNLAB | 专注网络创新技术
青云QingCloud业内率先支持云端全面透明代理功能 | SDNLAB | 专注网络创新技术 青云QingCloud业内率先支持云端全面透明代理功能
- 以O2O为核心的ERP思考
O2O已经火了一阵子了,很多人都在说O2O,各行各业都想和O2O有所结合,都认为这里面将会有巨大的商机. 在互联网发展到移动互联网的时代,我们的生活的很多方面已经被改变了,很多事情都已经可以在移动端完 ...
- 由链表初始化看C语言的二级指针
先来看C语言创建链表.插入节点和遍历链表的一段代码: #include <stdio.h> #include <stdlib.h> typedef int ElemType; ...
- Android开发学习之Adapter
Adapter是指适配器的意思,在Android中,适配器扮演者重要的角色,是UI与Data实现绑定的一个桥梁.Adapter负责创建和显示每个项目的子View和提供对下层数据的访问.支持Adapte ...
- 用户浏览器关闭cookie处理方法
方法一: function getSessionId(){ var c_name = "jsessionid"; // alert("cookie:"+docu ...