xml地图|网站地图|网站标签 [设为首页] [加入收藏]
通过MSSQl作业定时执行批处理BAT文件,修改语句
分类:数据库

前言

澳门新葡亰手机版,有些时候,我们可能会需要定时执行一下批处理来达到一定的目的,比如Oracle数据库的定时备份,当然Oracle也可以通过Rman实现定时备份。我们大多数的时候是通过操作系统的计划任务实现定时执行批处理。

但是当我们想要获取相关执行细节,MSSQL的作业是一个很好的选择。

 

 这是如何使用SQL server来  编写 数据库  表的 操作方式 

具体方案

首先我们需要一个能够满足自己需求的批处理文件。比如Oracle的定时备份批处理

澳门新葡亰手机版 1

这个批处理可以将Oracle数据库备份至异地服务器上。

然后通过MSSQL的作业定时执行该批处理

首先要开启MSSQL的XPCmdShell,如下图:

澳门新葡亰手机版 2

新建作业的步骤忽略不计。具体说也下作业种步骤属性该怎么写,如下图:

澳门新葡亰手机版 3

其中 exec xp_cmdshell后面跟的字符串为需要执行的批处理所在位置。

而后设置好作业的执行周期即可。

上周,以前公司的同事朋友找我帮忙,看看能否帮忙恢复一个MySQL 数据库,具体情况为:数据库版本为MySQL 5.6(具体版本不清楚),也不清楚具体的数据库引擎; 没有数据库备份,只剩下数据库下面的一些文件(frm、idb),具体原因是因为出现问题的时候,重装了MySQL,最要命的是ibdata1等文件也没有了,当然这中间细节过程如何,不清楚也不用去纠结了。大概就是这么一个情况。

 

后续

大多时候,有可能系统计划任务无法满足我们的需求时,可以采用这种方式。希望本文对你有所帮助,如果觉得不错请点一波赞。

转载请注明来源:

 

学习要点:

 

  SQL之-建库、建表、建约束、关系SQL基本语句大全.txt举得起放得下叫举重,举得起放不下叫负重。头要有勇气,抬头要有底气。学习要加,骄傲要减,机会要乘,懒惰要除。人生三难题:思,相思,单相思。
SQL之-建库、建表、建约束、关系、部分T-sql语句

因为数据库不大,将对应的文件拷贝到自己一台测试服务器的MySQL数据文件目录下后(下面实验测试,对数据库名等敏感信息做了一下混淆),如下所示,数据库名为test,show tables可以看到相关的表。

---创建库 创建库之前 先进行 查看数据库中是否 已存在 次数据库 有便删除 

 

--- if exists(select * from sys.sysdatabases where name='ConstructionDB')begin use master drop database ConstructionDB end go create database ConstructionDB on()

if exists(select * from sysobjects where name ='ConstructionDB') --查找命令
drop DATABASE ConstructionDB --删除 命令

Create database ConstructionDB
on(
name='ConstructionDB_date',
filename='E:技能抽查试题第二模块(数据库)试题——1任务一ConstructionDB_date.mdf',
size=3mb,
maxsize=10mb,
filegrowth=5% --增长速度为
)
log on(
name='ConstructionDB_log',
filename='E:技能抽查试题第二模块(数据库)试题——1任务一ConstructionDB_date.ldf',
size=2mb,
maxsize=5mb,
filegrowth=1mb
)
--使用T-SQL语句创建表
use ConstructionDB
go
---查询 库中是否存在 此表 存在则删除
if exists(select * from sysobjects where name = 'T_flow_step_def') 
drop table T_flow_step_def
--- 方法二
IF OBJECT_ID (N'bas_CardType') IS NULL
BEGIN --如果不存在该表,则进行创建
--drop table com_CodeRecord

--流程步骤定义表 
create table T_flow_step_def(
Step_no    int not null,     --流程步骤ID 
Step_name    varchar(30)    not null, --流程步骤名称 
Step_des    varchar(64)    not null,    --流程步骤描述
Limit_time    int not null,     --时限
URL     varchar(64)    not null,     --二级菜单链接 
备注    varchar(256)    not null, 
)

---流程类别表
create table T_flow_type(
Flow_type_id char(3) not null, --流程类别号 
Flow_type_name    varchar(64)    not null, --流程类别名称 
In_method_id    char(3) not null, --招标方式代号 
In_choice_id    char(3) not null, --项目选项代号 
备注    varchar(256)    not null, 
)
---标段情况表
create table T_sub_project(
Project_id varchar(32)    not null, ---工程编号 
Sub_pro_id char(2) not null, -- 标段编号 
Flow_type_id char(3) not null, --流程类别号 
Sub_pro_name varchar(64)    not null,--标段名称(招标项目名称) 
Usb_no varchar(64)    not null, --密码锁号
In_method_id char(3) not null, --招标方式代号 
In_scope_id char(3) not null, --招标范围代号 
In_choice_id char(3) not null, --项目选项代号 
Proj_type_id char(3) not null, --项目性质代号 
Engi_type_id char(1) not null, --工程性质代号
Pack_type char(1) not null, ---发包方式 
Grade_type_idv char(1) not null,--评分类别号
Flag_done char(1) not null,--完成标志 
Flag_forcebreak char(1) not null,--强制中断标志 
备注    varchar(256)    not null,
)

 

 

澳门新葡亰手机版 4

 

 

--创建一个数据库名为‘sql_test’

 

  1 create database sql_test
  2 go 
  3 --打开数据库 sql_test
  4 use sql_test
  5 go
  6 
  7 --建立学生表
  8 create table 学生
  9 (学生编号 char(4) primary key, 学生名字 varchar(50)not null)
 10 go
 11 
 12 --修改学生表
 13 alter table 学生 
 14 add 班级编号 char(4) null --添加班级编号字段
 15 -- (注意如果添加的字段不为空的话,是不能被添加的)
 16 go
 17 
 18 --建立班级表
 19 create table 班级
 20 (班级编号 char(4) primary key ,班级名称 varchar(50)not null)
 21 go
 22 
 23 --建立课程表
 24 create table 课程
 25 (课程编号 char(4) primary key ,课程名称 varchar(50) not null,开课日期 datetime )
 26 go
 27 
 28 --修改课程表
 29 alter table 课程
 30 add 课程代号 varchar(10) null --添加课程代号字段
 31 go
 32 
 33 alter table 课程
 34 drop column 开课日期  --删除开课日期字段
 35 go
 36 
 37 alter table 课程
 38 alter column  课程名称 varchar(20) not null   --修改课程名称字段
 39 go
 40 
 41 --建立一个product_test_one 表,与下个表类似,只不过在constraint前面有个‘逗号’不影响执行
 42 create table product_test_one
 43 (
 44 id char(10) not null, name varchar(20) null, price money default 20.5,quantity smallint null, constraint pk_id primary key clustered (id)
 45  )
 46 go
 47 
 48 
 49 --建立一个product_test_two 表
 50 
 51 create table product_test_two
 52 (
 53 id char(10) not null, name varchar(20) null, price money default 20.5,quantity smallint null constraint pk_id2 primary key clustered (id)
 54  )
 55 go
 56 
 57 --删除表 pruduct_test_one表
 58 drop table product_test_one
 59 go
 60 
 61 --建立一个student表,使其中的 name 字段具有唯一性
 62 create table student 
 63 (
 64 id char(8), name char(10) --表字段
 65 constraint pk_id primary key (id), --添加一个主键约束 
 66 constraint uk_name unique (name) --添加一个唯一性约束
 67 )
 68 go
 69 
 70 --建立一个student4表,同上 (注意:constraint 与constraint 之间一定要有逗号,否则出错!)
 71 create table student4 
 72 (
 73 id char(8), name char(10) --表字段
 74 constraint pk_id4 primary key (id), constraint uk_name4 unique (name)
 75 )
 76 go
 77 -- 删除表student4
 78 drop table student4
 79 go
 80 
 81 --建立一个student3表,同上
 82 create table student3
 83 (
 84 id char(8), name char(10), --表字段
 85 constraint pk_id3 primary key (id) ,constraint uk_name3 unique (name)
 86 )
 87 go
 88 
 89 --删除表student3
 90 drop table student3
 91 go
 92 
 93 
 94 --constraint 约束名 check(逻辑条件表达式)
 95 
 96 --创建一个‘员工‘表,使其输入的性别字段(sex)只能接受‘m’或则‘f’,而不能接受其他数据
 97 --并且为phone字段创建检查约束,限制只能输入类似0108564712之类的数据,而不能随意输入其他数据
 98 create table 员工
 99 (
100 id char(5),name char(20),sex char(2),phone int
101 constraint pk_zid primary key (id),      --此间一定要有‘逗号’分隔 ,定义主键约束
102 constraint chk_sex check (sex in (‘f‘,‘m‘) ),
103 constraint chk_phone check (phone like ‘(010) [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9]‘)
104 )
105 go
106 
107 
108 --constraint 约束名 default 约束表达式 [for 字段名]
109 
110 -- 创建一个表‘默认约束’,为字段sex创建默认约束
111 create table 默认约束
112 (
113 id char(5) primary key ,sex varchar(2) constraint con_sex default ‘m‘ 
114 )
115 go
116 
117 --修改‘默认约束’表
118 alter table 默认约束
119 add name varchar(10)null constraint con_name default ‘你好宝贝‘ --增加一个字段为‘name’,默认值为‘你好宝贝’
120 go
121 
122 --往班级表里添加8条记录
123 insert into 班级 values(‘bj01‘,‘一班‘)
124 insert into 班级 values(‘bj02‘,‘二班‘)
125 insert into 班级 values(‘bj03‘,‘三班‘)
126 insert into 班级 values(‘bj04‘,‘四班‘)
127 insert into 班级 values(‘bj05‘,‘五班‘)
128 insert into 班级 values(‘bj06‘,‘六班‘)
129 insert into 班级 values(‘bj07‘,‘七班‘)
130 insert into 班级 values(‘bj08‘,‘八班‘)
131 go
132 --显示班级所以记录
133 select * from 班级
134 go
135 --删除班级表里班级编号大于bj06的记录
136 delete from 班级 where 班级编号>‘bj06‘
137 go
138 --显示班级所以记录
139 select * from 班级
140 go
141 
142 --向学生表里添加记录
143 insert into 学生 values(‘xs01‘,‘one‘,‘bj01‘)
144 insert into 学生 values(‘xs02‘,‘two‘,‘bj01‘)
145 insert into 学生 values(‘xs03‘,‘three‘,‘bj01‘)
146 insert into 学生 values(‘xs04‘,‘four‘,‘bj02‘)
147 insert into 学生 values(‘xs05‘,‘five‘,‘bj03‘)
148 insert into 学生 values(‘xs06‘,‘six‘,‘bj02‘)
149 insert into 学生 values(‘xs07‘,‘seven‘,‘bj04‘)
150 insert into 学生 values(‘xs08‘,‘eight‘,‘bj03‘)
151 insert into 学生 values(‘xs09‘,‘nine‘,‘bj04‘)
152 insert into 学生 values(‘xs10‘,‘ten‘,‘bj05‘)
153 insert into 学生 values(‘xs11‘,‘eleven‘,‘bj06‘)
154 insert into 学生 values(‘xs12‘,‘twleve‘,‘bj06‘)
155 go
156 --显示学生所有的记录
157 select * from 学生
158 go
159 
160 --连接查询
161 select * from 学生,班级 where 学生.班级编号=班级.班级编号
162 go
163 
164 --以下效果同上一条相同
165 
166 --选择的连接查询
167 select 学生.学生编号,班级.班级编号, 学生.学生名字,班级.班级名称 from 学生,班级 where 学生.班级编号=班级.班级编号
168 go
169 --以下效果同上一条相同
170 
171 
172 
173 --查询一班的学生
174 select* from 学生 where 班级编号 in(select 班级编号 from 班级 where 班级编号=‘bj01‘)
175 go
176 --与上面一条查询语句一样功能
177 select a.学生编号,a.学生名字,a.班级编号 from 学生 as a ,班级 as b where a.班级编号=b.班级编号 and b.班级编号=‘bj01‘
178 go
179 
180 --统计一班学生人数
181 select count(学生编号)as 学生统计 from 学生 
182 where 班级编号 in(select 班级编号 from 班级 where 班级编号=‘bj01‘)
183 go
184 
185 --group的用法和count()函数的用法
186 
187 
188 --统计一班学生人数,并显示学生的名字和所在班级
189 select count(学生编号)as 学生统计, 学生名字,班级编号 from 学生 
190 where 班级编号 in(select 班级编号 from 班级 where 班级编号=‘bj01‘)
191 group by 班级编号,学生名字
192 go

其中有几张表的存储引擎为MyISAM,那么这些表的数据是完全可以恢复的,但是大部分表的存储引擎为InnoDB,访问表或查看表都会提示“ERROR 1146 (42S02): Table 'xxxx' doesn't exist 不存在。

 

 

mysql> desc think_cache;

ERROR 1146 (42S02): Table 'test.think_cache' doesn't exist

mysql> show create table think_cache;

ERROR 1146 (42S02): Table 'test.think_cache' doesn't exist

mysql> 

 

由于共享表空间的ibdata1数据文件不存在了,加之有没有备份,所以我武断的判断这个数据库真的无法恢复了,但是过后一天,这个朋友跟我说找了一家数据恢复公司将这个数据库恢复了。 听到这个消息颇有点学艺不精的尴尬(其实谈不上尴尬吧,本来还在学习MySQL的路上,有些知识点不清楚也很正常。经验是需要慢慢积累的),不过更多的是好奇别人是如何恢复数据的,既然别人能够恢复,那么自己下一次遇到这种情况也要能搞定。下面就来复盘一下别人是如何恢复数据的(其实只要稍稍做点功课,发现这个其实挺简单的)

 

首先,我们来了解一下MySQL 表空间数据文件idbdat1文件相关概念和知识点:

 

    InnoDB采用按表空间(tablespace)的方式进行存储数据, 默认配置情况下会有一个初始大小为10MB, 名字为ibdata1的文件, 该文件就是默认的表空间文件(tablespce file),用户可以通过参数innodb_data_file_path对其进行设置,可以有多个数据文件,如果没有设置innodb_file_per_table的话, 那些Innodb存储类型的表的数据都放在这个共享表空间中,而系统变量innodb_file_per_table=1的话,那么InnoDB存储引擎类型的表就会产生一个独立表空间,独立表空间的命名规则为:表名.idb. 这些单独的表空间文件仅存储该表的数据、索引和插入缓冲BITMAP等信息,其它信息还是存放在共享表空间中。

 

    其实当时主要是对这个概念有点模糊了,以为这个系统变量innodb_file_per_table默认是关闭的,数据都会存储在共享表空间中,那么这些文件删除了,数据就无法恢复。所以武断的下结论,其实从MySQL 5.6.6开始, 系统变量innodb_file_per_table默认是启用的。只要再多了解一点或者说更深入了解一点的话,情况就会立马就会反转。也就是说如果开启了独立表空间,可从ibd文件中恢复数据。即使共享表空间的数据文件idbdata1丢失也不要紧,反之,如果未开启独立表空间时,idbdat1被删除了,数据也会被删除,只能从备份中恢复,真的没有其他办法。

 

 

那么我们接下来看看,如何从idb文件中恢复数据吧,我们需要用到mysqlfrm工具, 需要安装MySQL Utilities,下面是安装MySQL Utilities 1.5.5

 

# tar -xvf mysql-utilities-1.5.5.tar.gz

# cd mysql-utilities-1.5.5

# python ./setup.py build

# python ./setup.py install

 

 

提取frm文件的表结构信息

 

mysqlfrm 是一个恢复性质的工具,用来读取.frm文件并从该文件中找到表定义数据生成CREATE语句。此处不对mysqlfrm工具做过多介绍,我们使用msqlfrm来生成该数据库的表的CREATE语句

 

[root@DB-Server ~]# service mysql stop

Shutting down MySQL.... SUCCESS! 

[root@DB-Server ~]# /usr/local/bin/mysqlfrm --basedir=/usr --port=3306 --user=root /data/mysql/test/ > test_frm.sql

[root@DB-Server ~]# 

 

检查导出的SQL语句,发现都是“ERROR: The server version for this file is too low. It requires a server version 5.6.29 or higher but your server is version 5.6.20. Try using a newer server or use diagnostic mode”这类错误:

 

[root@DB-Server ~]# more test_frm.sql 

# Spawning server with --user=root.

# Starting the spawned server on port 3306 ... done.

# Reading .frm files

#

# Reading the think_cache.frm file.

ERROR: The server version for this file is too low. It requires a server version 5.6.29 or higher but your server is version 5.6.20. Try using a newer server or use diagnostic mode.

#

# Reading the think_session.frm file.

ERROR: The server version for this file is too low. It requires a server version 5.6.29 or higher but your server is version 5.6.20. Try using a newer server or use diagnostic mode.

#

# Reading the wx_activity_config.frm file.

ERROR: The server version for this file is too low. It requires a server version 5.6.29 or higher but your server is version 5.6.20. Try using a newer server or use diagnostic mode.

#

........................................................................................

 

从中可以看到这个数据库之前的版本为MySQL为5.6.29,而我这里的MySQL版本比这个低(MySQL 5.6.20)。所以必须找一个跟这个版本相同或高的MySQL数据库操作才行。于是在另外一台测试服务器安装了MySQL

 

[root@gettestlnx02 ~]# service mysqld stop

 

Stopping mysqld:  [  OK  ]

 

[root@gettestlnx02 tmp]# mv test  /data/mysqldata/mysql/test

 

[root@gettestlnx02 tmp]# cd /data/mysqldata/mysql/

 

/usr/bin/mysqlfrm --basedir=/usr --port=3306 --user=root /data/mysqldata/mysql/test/ > test_frm.sql

 

如何要查看输出信息,可以使用参数-vvv

 

/usr/bin/mysqlfrm --basedir=/usr --port=3306 --user=root -vvv /data/mysqldata/mysql/test/ > test_frm.sql

本文由澳门新葡亰手机版发布于数据库,转载请注明出处:通过MSSQl作业定时执行批处理BAT文件,修改语句

上一篇:没有了 下一篇:生成MySql数据库的数据字典代码参考,6不删空用
猜你喜欢
热门排行
精彩图文