存档

文章标签 ‘脚本’,文章数:5

迁移ASE数据库的表结构时,需要注意表DDL的顺序,否则有些对象会因为其所引用的对象不存在而导致创建不成功。

解决的方法:将同样的脚本执行两次。

据我所知,sybase central或者ddlgen导出的语法中是没有很好的处理好对象之间的引用先后顺序的,所以,很有可能你的脚本需要执行两次才能保证所有的对象都成功创建上。

下面举个简单的例子,两张表,一张外键引用另一张。

sybase ASE中要求被外键引用的表的被引用列上有唯一约束。

在移植对象DDL的时候,举个例子:表A外键引用表B,如果导出的DLL语句中表A的定义语句在前面,而表B的DDL在后面。那么在创建表A的时候会因为外键引用的表B不存在而导致表A创建不成功。表B是能够成功创建的。

第二次执行上面相同的脚本时,首先会成功创建表A,因为其所引用的表B已经创建上了。而表B不会再次创建因为上次执行的时候已建上,会给出一个错误信息。这在isql是个错误信息,可能在sybase central中会是一个让人讨厌的弹出窗口。

在数据库备份策略中,因为磁盘空间所限,需要删除N天前的备份文件。

本博客中有篇:实现连续N次备份数据库的脚本

其中有删除七日前的数据库备份文件的命令。那篇博客中利用了vbs处理日期的方法。但是,有点不妥当的地方,假如近七日内没有备份成功,或者说近七日内没有任何备份文件。如果删除了七日前的备份文件,那么就没有任何一个有效的备份文件了。这在数据库备份策略中是尤其需要注意的。

 

下面的命令不仅仅能够删除4天前的备份文件,而且能够保证有4天的备份文件。说白了也就是保留4份备份文件。呵呵。

del /f d:\123.txt && FOR /F "usebackq tokens=1,2,3*" %i IN (`dir E:\oracle\oradata\orcl /A-D /O-D ^| find ":"`) DO @echo %i %j=%l >>d:\123.txt
for /F "usebackq skip=5 delims== tokens=1*" %i in (d:\123.txt) do echo del /f %j

 

注释:skip=5表示跳过前4行记录。d:\123.txt是保存临时数据的文件,可以改成其他,比如: %temp%\123.txt

目录E:\oracle\oradata\orcl为备份文件所在路径。

如果放在bat脚本文件中执行上面的2行命令。需要将 %i之类的替换成 %%i

将上面2行命令的第2行中加粗字体的echo去掉,就能够实现删除操作了。 为了保险起见,先打印出删除文件的语句。

另:关于for循环命令的用法可以参考:CMD命令行:for命令详解[转]

 

 

 

 

 

 

以下的脚本能够自动创建数据库、登录、用户并能给用户分配命令权限。只需要指定用户数据库的名称,数据设备、日志设备的大小,登录名称以及登录密码即可。

局限性:

没有判断即将要创建的设备是否存在?

将数据库设备创建在和master设备同一目录下,不能提高物理IO的性能。

脚本文件下载:sybase数据库自动创建脚本.sql

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

use master
go
declare @dbname varchar(30)
declare @MasterDevicePath varchar(255),@LogicalDataDevName varchar(30),@LogicalLogDevName varchar(30)
declare @DATDevicePath varchar(255),@LOGDevicePath varchar(255),@DataDevSize int,@LogDevSize int,@DataDevPageCount  int,@LogDevPageCount int
declare @SQLTEXT varchar(255)
declare @loginname varchar(30),@loginpasswd varchar(30)
set nocount on
begin
-- @dbname 代表将要创建的数据库名称

以下操作均由sybase用户来做:

新建一个脚本文件,譬如/sybase/script/dump.sh
类容如下

$ cat dump.sh
/sybase/OCS-12_5/bin/isql -Usa -P******* -S******* -i /sybase/script/dump.sql -o /sybse/script/dump.log
mv /caiwubackup/backup/cwbase1.bak /caiwubackup/backup/cwbase1_`date +%Y%m%d`.bak
mv /caiwubackup/backup/cwbase2.bak /caiwubackup/backup/cwbase2_`date +%Y%m%d`.bak
mv /caiwubackup/backup/cwbase3.bak /caiwubackup/backup/cwbase3_`date +%Y%m%d`.bak
mv /caiwubackup/backup/cwmaster.bak /caiwubackup/backup/cwmaster_`date +%Y%m%d`.bak
mv /caiwubackup/backup/master.bak /caiwubackup/backup/master_`date +%Y%m%d`.bak

(注意:`号是在键盘左上角和波浪线在一起的那个键上,不是单引号)

在同一个目录下新建脚本dump.sql
类容如下

$ cat dump.sql

dump database cwbase1 to "/caiwubackup/backup/cwbase1.bak"
go
dump database cwbase2 to "/caiwubackup/backup/cwbase2.bak"
go
dump database cwbase3 to "/caiwubackup/backup/cwbase3.bak"
go
dump database cwmaster to "/caiwubackup/backup/cwmaster.bak"
go
dump database master to "/caiwubackup/backup/master.bak"
go

制定一个定时计划,每天晚上23点30开始备份数据库

$crontab -e
30  23 *  *  *  /sybase/script/dump.sh

根据你本机的实际情况,修改相关数据库名称和路径。

我们知道根据生产数据库的业务数据情况来安排备份的频率,比如:每月、每周、每日,有的甚至每小时备份一次。要备份sybase数据库,需要自己手动写命令。这样,下一次可能会覆盖上一次的备份文件。通过脚本在下一次备份时产生不同的备份文件名称就不会覆盖上一个备份文件了。这样,能够自动保留数据库的多个数据库备份文件,更有力的保障了数据库的安全。

将下面的脚本复制到记事本中,另存为bat格式。添加到windows的计划任务中,
============================================================================================

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
echo off
cls
:: 默认保留近7日来的数据库备份,可以把7改成自己想连续的天数
:: 其中d:\sybase\data为数据库备份地址,可以自己再次指定
:: master为默认备份的数据库名称,可以修改成其它用户数据库名称
set databak_path=d:\sybase\data
set databasename=master
echo dt=date()-7>%temp%\OldDate.vbs
echo s=right(year(dt),4) ^& "-" ^& right("0" ^& month(dt),2) ^& "-" ^& right("0" ^& day(dt),2)>>%temp%\OldDate.vbs
echo wscript.echo s>>%temp%\OldDate.vbs
for /f %%f in ('cscript /nologo %temp%\OldDate.vbs') do @set DelFlag=%%f
::删除七日前的数据库备份文件
if exist "%databak_path%\%databasename%_%DelFlag%.dump" del "%databak_path%\%databasename%_%DelFlag%.dump"
del %temp%\OldDate.vbs
if exist %temp%\dump_db.txt (del %temp%\dump_db.txt)
echo dump database %databasename% to "%databak_path%\%databasename%_%date:~0,10%.dump" >>%temp%\dump_db.txt
echo go >>%temp%\dump_db.txt
isql -Usa -P -Syour_servername <"%temp%\dump_db.txt" >>%databak_path%\dump_log.txt
del "%temp%\dump_db.txt"

————————————————————————————————————
——— 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
——— 转载务必注明原始出处 : http://www.dbainfo.net
——— 关键字: ASE 数据库 备份 自动 连续备份  删除旧备份
————————————————————————————————————