楼主: ninetailsfox

[参考文档] Adaptive Server Anywhere 7.0网上培训教材

[复制链接]
论坛徽章:
2
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442017金鸡报晓
日期:2017-01-10 15:33:11
11#
 楼主| 发表于 2007-11-13 23:06 | 只看该作者
Adaptive Server Anywhere 7.0网上培训教材


操纵数据:

目      标

1、构造基本的 SELECT, INSERT, UPDATE 和 DELETE 语句。
2、熟悉 Adaptive Server Anywhere支持的主要内置函数。
3、解释连接( join)操作的内涵
4、解释连接操作如何完成
5、解释Adaptive Server Anywhere中所支持的 KEY 及 NATURAL JOIN (自然连接)
6、说明外连接( outer join)所产生的结果
7、解释合并(union)操作的内涵
8、解释子查询的内涵
9、利用批量 INPUT 及OUTPUT函数对表数据进行装入和卸出
10、利用 LOAD 和 UNLOAD 对整个数据库进行装入和卸出

内      容
1、SQL 数据操纵语言(DML)
2、基本的数据操纵语句
3、内置函数
4、对多表数据进行操纵
5、输入和输出表数据
6、卸载和重新装入数据库


SQL 数据操纵语言 :

用于读出,增加,删去或修改数据。
它们大多是在前端应用中被使用,或是独立地执行或是嵌在基于Web的应用中。
缺省情况下,Adaptive Server Anywhere 使用 Watcom SQL方言
在版本 6.0 及 7.0中还支持 Sybase T-SQL语法

基本的数据操纵语句 :

SELECT— 由数据库检索数据
INSERT —向数据库增加数据
UPDATE —对数据库中数据进行修改
DELETE —从数据库中删除数据
利用附加的动词,子句和函数能使功能更完善。

SELECT:
操纵对象可以是表或视图
要求读取满足特定条件的数据
用户必须具有SELECT 权限
基本语法
SELECT [DISTINCT] select-list FROM table-list WHERE search-conditions ORDER BY column-list [DESC]

INSERT:

向表中插入数据 ,一次插入一行,对某几列或所有列插入数据
用户必须具有对该表的 INSERT 权限
基本语法
INSERT [INTO] table-name
[column-name,…]  VALUES (expression | DEFAULT, …)

INSERT NULL 和 DEFAULT 值 :

— 插入NULL 值:
INSERT INTO department
VALUES (123, 'Accounting', NULL);

— 插入 DEFAULT 值

INSERT INTO sales_order
(id, cust_id, order_date, fin_code_id, region, sales_rep)
VALUES (987, 65432, DEFAULT,
'ax', 'SEUSA', 196);


注: 在插入时必须使用 NULL 或 DEFAULT
对任何给出名的列都不能忽略其值
对于并未明确给出列名的列无须指定其值

多行插入:

把一个 SELECT 语句的结果集插入到表中
语法
INSERT [INTO] table-name [column-list]  SELECT…;

实例
INSERT INTO  former_employees
SELECT * FROM employee
WHERE termination_date IS NOT NULL;


UPDATE:

对表中的数据进行更新 ,用 SET子句指定新的值 ,用 WHERE 子句确定要被修改的老的值
用户必须具有对该表的 UPDATE权限
基本语法
UPDATE table-list SET column-name = expression, … [WHERE search-condition]

DELETE:

从表中删去数据 ,仅删去数据本身,而不是表结构。利用 WHERE 子句确定要被删去的行
用户应具有对表的DELETE 权限
基本语法
DELETE [FROM] table-name [WHERE search-condition]

使用道具 举报

回复
论坛徽章:
2
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442017金鸡报晓
日期:2017-01-10 15:33:11
12#
 楼主| 发表于 2007-11-13 23:06 | 只看该作者
TRUNCATE(截断) :

它不会使触发器被激发
最小化写日志(基本上不写日志)
比 DELETE减少开销 ,不被复制 ,在6.0.3 版中引入选项Truncate_with_auto_commit 它能改善系统性能 ,在 8.0版针对含外键的表提供了快速截断功能

语法
TRUNCATE TABLE table-name;

实例 TRUNCATE TABLE employee;

内置函数:

用于增强 SELECT动词的功能
能够获得不是存储在用户表中的信息,类似于日期这样的系统信息,数据值的统计

函数分类 :

聚合型
数值型
字串型
日期和时间
数据类型转换
系统函数
其它类型

内置函数实例 :
获得在职的女雇员的总数,以及她们参加工作的最早及最晚日期。
SELECT COUNT(*), min(start_date),
   max(start_date)
FROM employee
WHERE sex = 'F'
AND termination_date IS NULL;


GROUP BY:

与聚集函数一起使用以指定计算总计时所处的层次
为出现在该 GROUP BY 列名中每个值获得一行结果

数据分组 :

例 1 — 不分组 (在表一级求和)
SELECT COUNT(*) FROM employee;

例 2 — 列出销售代表名单及分派给他们的定单数量

SELECT sales_rep, COUNT(*) FROM sales_order GROUP BY sales_rep;

限制 GROUP BY:

利用 HAVIN子句来限制特定分组的结果集
例3 — 仅列出其定单数量多于50个的那些销售代表的信息
SELECT sales_rep, COUNT(*) FROM sales_order GROUP BY sales_rep HAVING count(*) >; 50;

对列名加限制性修饰 :

如果在一个语句中要涉及到不同的表中两个同名列时,应当在列名前加上表名进行限制。

SELECT employee.id, emp_fname, emp_lname FROM employee, manager WHERE employee.id = manager.id

UNION ALL:

UNION ALL 能把两张表中的所有行(包括重复的)全部显示出来 ,它不使用临时表


实例 — 列出客户及联系人的姓名及地址清单:
SELECT fname, lname, address, city, state, zip FROM customer UNION ALL SELECT first_name, last_name, address, city, state, zip FROM contact;

子查询 :

在另一个DML 语句中含有一个或多个 SELECT语句
当一个查询需利用另一个查询的结果才能继续往下处理时,则用到子查询。
结果集中仅可包含一个列
为提高性能所有的子查询都被放入高速缓存

实例 — 列出在 1/1/94以后签单的客户
SELECT * FROM customer WHERE id IN
(SELECT cust_id
FROM sales_order
WHERE order_date >; '1994/01/01') ORDER BY customer.company_name;

输入和输出数据 :
利用 INPUT 和 OUTPUT 或 LOAD 和 UNLOAD语句
快速地批量装载
一个文件 <--         -->; 一个表
文件格式 :
ASCII, dBASE, dBASEII, dBASEIII, DIF, FIXED, FoxPro, Lotus, WATFILE


INPUT:

把数据从文件读出然后输入到指定的表中
基本语法 :

INPUT INTO table-name [FROM file-name | PROMPT] [BY ORDER | BY NAME] [DELIMITED BY string]
实例
INPUT INTO employee
FROM employee.imp

OUTPUT:

基本语法
SELECT…; OUTPUT TO file-name [FORMAT output-format] [DELIMITED BY string]
实例  SELECT * FROM employee
OUTPUT to employee.exp
FORMAT ASCII;


卸载和重新装入数据库 :

当你打算修改(比如页面尺寸)数据库选项或是想回收因删除而造成的空闲空间时,必须对数据库进行卸载和重新装入

卸载和重新装入:

dbunload
dbinit
利用交互SQL reload.sql  文件

重构-rebuild (采用缺省命令行选项)
REBUILD old_db_name new_db_name passwrd

1. 执行 dbunload
DBUNLOAD -c  "ENG=public;DBN=sample;UID=dbaWD=sql"  c:\unload
2. 执行 dbinit
3. 利用交互SQL读取 reload.sql  READ reload.sql


数据库的重构 :

自动处理 dbunload, dbinit及 reload.sql
语法
rebuild old-database new-database [dba-password]
实例
    rebuild mydata mynewdata sql

小      结 :
1、SELECT, INSERT, DELETE和 UPDATE 是4个最基本的SQL 语句。
2、Adaptive Server Anywhere 提供了多种内置函数,极大地丰富了 SELECT 操作的功能从而可获取多种无法从数据表中直接得到的信息
3、当利用聚集函数计算总计时,可以用 GROUP BY 子句标明是在什么层次上作总计。
4、连接(Join)操作是按垂直方向对多个表的数据进行检索和组合.
5、子查询的含义是指在另一个 SELECT 语句中又含有一个或多个 SELECT 语句.
6、合并( UNION)操作是从多个表中检索数据并按水平方向把它们组合起来。

使用道具 举报

回复
论坛徽章:
2
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442017金鸡报晓
日期:2017-01-10 15:33:11
13#
 楼主| 发表于 2007-11-13 23:07 | 只看该作者
Adaptive Server Anywhere 7.0网上培训教材


用户与安全性

目    标
识别在数据库被初始化时所建立的ID
建立用户和用户组
解释用户和用户组之间的关系
识别ASA所支持的各类权限
利用GRANT或REVOKE来指派权限。

内     容
数据库的安全性和权限
创建用户
指派用户权限
创建用户组

安全性与权限
数据库安全管理的手段有:
用户 ID 口令 权限 用户组

用户组:
用户组是由用户成员构成的
一个用户可以是多个用户组的成员
一个用户组可以是另一个用户组的成员
用户组可以简化权限的管理

SYS 和 PUBLIC:
SYS 用户和用户组:
1、它是系统表及系统视图的主人
2、没有口令
3、不能以 SYS身份连接数据库
4、系统表不能被用户或 DBA修改

PUBLIC 组 :

1、它是 SYS组的一个成员
2、有权SELECT系统表及视图
3、不能以 PUBLIC身份连接数据库  自版本 6.0.3之后支持

DBA ID :

1、有权修改除系统表以外所有数据库
2、最初的口令是 SQL
3、要限制具有 DBA权限的人数

DBO ID
1、用作与 ASE 的可兼容性
2、它是与 ASE兼容的系统表的主人


数据控制语言(DCL)的使用:

1、利用 DCL来建立用户,用户组并为其授权
2、有两个动词:  grant 和revoke
3、DCL语句是自动被提交的

建立用户和设定口令 :
1、建立用户ID
2、改变已有用户ID的口令
3、实例
GRANT CONNECT TO mary IDENTIFIED BY bluesky;
GRANT CONNECT TO mary, george IDENTIFIED BY bluesky, sheep;
GRANT CONNECT TO mary IDENTIFIED BY redapple;

删除用户:

1、删去用户 ID
要具有 DBA 权限 ,该用户所拥有的对象也都被删除

2、实例
REVOKE CONNECT FROM mary;
REVOKE CONNECT FROM mary, george;

分派用户权限:
可以分派以下各类权限:
1、EXECUTE 权
2、对表的操作权
3、RESOURCE 权
4、DBA 权

下面将按其受限制程度由低到高的次序来讨论

使用道具 举报

回复
论坛徽章:
2
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442017金鸡报晓
日期:2017-01-10 15:33:11
14#
 楼主| 发表于 2007-11-13 23:07 | 只看该作者
EXECUTE 权限
1、允许用户执行指定的存储过程
2、利用存储过程用户可以要求执行并没有按常规方式授权的命令,比如,用户若有权执行一个能修改数据的存储过程,他并不需要具有 UPDATE权限
3、获得存储过程的执行权并未获得对基础对象的某种权限

对表的操作权 :
SELECT
INSERT
UPDATE
DELETE
ALTER 改变表结构
REFERENCES 增加索引和键值
ALL 上述的所有权限


特殊权限:

1、RESOURCE 权限
2、建立和删除如下数据库对象的权限 (表 存储过程 视图 函数)
3、DBA权限
4、所有数据库权限 能建立及删除用户口令  能访问所有的表
5、注意,各项权限应分别授予!

EXECUTE 权限的授予和回收 :

授予或回收对一个存储过程的执行权
实例
GRANT EXECUTE ON employee_update to mary;
GRANT EXECUTE ON employee_update to jane, bob, gary, mike;
REVOKE EXECUTE ON employee_update from mary;


授予对表的操作权限 :

基本语法 :
GRANT [SELECT (column-name, …) | INSERT | UPDATE (column-name, …)  | DELETE | ALTER | REFERENCES | ALL] ON table-name TO userid

以下用户可以对表或视图执行此命令:
1、DBA
2、对象主人
3、靠 GRANT OPTION获得权力的用户

授予对表的如下操作权限 :
1、SELECT — 用户可对表的数据进行读取 ,可只限于某些列
2、INSERT — 用户可对表插入数据
3、UPDATE — 用户可修改表数据 ,可只限于某些列
4、DELETE – 用户 可删去表中数据
5、ALTER — 用户可执行 ALTER TABLE命令 注意,它会使模式 (schema)改变!
6、REFERENCES — 用户可增加索引和键
7、ALL-授予上述所有权限

授予对表进行操作的权限 :
GRANT SELECT ON department TO mary;
GRANT INSERT ON department TO george;
GRANT UPDATE (dept_head_id)ON department TO george;
GRANT ALTER ON department TO george;
GRANT ALL ON department TO george;

一次授予多种权限 :
用一个语句可实现授予多种权限,
GRANT SELECT, INSERT, UPDATE (dept_head_id)  ON department
TO mary, jane, joe;

获得再授权的权力 :
DBA 或表的主人,可把对表进行操作授权的权力传递给其它用户。
GRANT SELECT ON department TO mary WITH GRANT OPTION;

特殊权限 :
有两类特殊权限:
1、RESOURCE
用户可以建立数据库对象   GRANT RESOURCE to mary;
2、DBA
让用户能对该数据库实现全部控制
GRANT DBA to mary;

权限的回收 :
回收用户的某些权限
REVOKE INSERT ON department FROM mary; REVOKE RESOURCE FROM bob;

权限的级联回收 :

在完成以下一系列操作之后,用户 bob, mary及 jane 都会失去对employee表的SELECT权力。

1、DBA 执行 :
GRANT SELECT ON employee TO mary WITH GRANT OPTION;
2、Mary 执行
GRANT SELECT ON employee TO bob, jane;
3、DBA 又执行
REVOKE SELECT ON employee from mary;

使用道具 举报

回复
论坛徽章:
2
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442017金鸡报晓
日期:2017-01-10 15:33:11
15#
 楼主| 发表于 2007-11-13 23:07 | 只看该作者
建立用户组:

1、采用用户组可简化授权的管理
2、任何用户组都自动成为 PUBLIC组的成员
3、一个用户 ID可成为多个用户组的成员
4、一个用户组还能是另一个用户组的成员

建立用户组 :
1、建立用户 ID
在创建时如果不加 IDENTIFIED BY 选项,则只能创建一个用户组,它不能象常规的用户那样去连接数据库。
2、可利用Grant group 语句对一个用户 ID冠以用户 组状态。
实例 :
以下的 accounting 用户组可以一个用户身份等录
GRANT CONNECT TO accounting IDENTIFIED BY orange;
GRANT GROUP TO accounting;

以下的 payrol用户组不能以用户身份登录
GRANT CONNECT to payroll;
GRANT GROUP to payroll;

用户组权限 :

用户组成员可以继承针该用户组对以下对象以明显方式所获得的权力:

视图
存储过程

以下几方面的权限不能为组成员所继承:
属主权
DBA 权限
RESOURCE 权限
GROUP 权限


PUBLIC用户组 :

1、所有的用户都自动成为该组的成员
2、利用 PUBLIC 用户组,授权所有的用户都可访问某些表

GRANT SELECT ON table-name TO PUBLIC

用户组属主 :
在访问属于本组的对象时,不必在其名字前加属主名。
实例:
1、sales_order 表若属于 accounting用户组
2、Mary 正好是 accounting 用户组的成
3、则Mary 可执行如下的语句
SELECT * FROM sales_order;

建立属于用户组的对象 :
1、具有CONNECT特权的用户组ID可直接登录数据库并建立其自己的数据库对象。
2、对于不具有 CONNECT特权的用户组可由 DBA 为其建立对象
实例 CREATE TABLE accounting.sales_order…;

3、组内成员在访问本组对象时,无须在该对象名字前面缀以组名。

增加用户组成员 :
1、可把一个用户或用户组增加为另一组的成员。
2、DBA或用户组主人可完成此功能
3、实例
使一个用户成为某个用户组的成员
GRANT MEMBERSHIP IN GROUP accounting TO mary;
使一个用户组成为另一个用户组的成员
GRANT MEMBERSHIP IN GROUP finance TO accounting;
Mary 同时具有 accounting 和 finance 两个组的特权

由用户组中删去成员 :

1、DBA 或用户组主人可完成此功能。
2、实例
REVOKE MEMBERSHIP IN GROUP accounting FROM mary;
Mary不再是 accounting 或 finance用户组的成员了。

小    结 :

1、ASA为每个新的数据库都能自动地创建 SYS 和PUBLIC 用户组以及 DBA 和 DBO ID。
2、在建立了用户 ID和口令之后你可以利用 SQL的数据控制语句 GRANT 及 REVOKE.分派权限。
3、可以授予用户的权限有以下几类: EXECUTE  存储过程,对表的操作,RESOURCE 及 DBA 特权。
4、当用户刚被建立,它就成了 PUBLIC用户组的成员。
5、针对存储过程的授权是指对其的可执行权
6、对单个用户 ID分别授权会很耗时且易失误。利用用户组来管理权限会更加有效。

使用道具 举报

回复
论坛徽章:
2
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442017金鸡报晓
日期:2017-01-10 15:33:11
16#
 楼主| 发表于 2007-11-13 23:08 | 只看该作者
Adaptive Server Anywhere 7.0网上培训教材


事务处理:

目    标

1、定义一个事务
2、解释在Adaptive Server Anywhere环境下什么时候开始一个事务
3、解释什么是保存点以及什么时候提交在保存点完成的改变
4、说明Adaptive Server Anywhere如何能保障能把事务当作一个原子化的工作单元来处理
5、识别并描述Adaptive Server Anywhere中所采用的三类锁

6、解释事务的阻塞以及它是如何在Adaptive Server Anywhere中被设置的
7、识别两类死锁以及如何使死锁的发生极小化
8、识别四种隔离级别以及何种应用采用何种隔离级别

内    容
1、事务
2、事务原子化
3、事务可恢复性
4、事务一致性

事务:
1、事务的原子化 :
事务中的所有语句要么全部执行要么一个也不执行。
2、事务的可恢复性
当系统出现故障之后,事务必须被恢复。
3、事务一致性
同时执行的各事务绝对不能对彼此的数据造成 “污染”。

链式(Chained)事务模式:
1、在出现下列情形后的第一个语句开始一个事务
   连接到一个数据库
   COMMIT 或 ROLLBACK
     BEGIN TRANSACTION
2、除非明显地给出 COMMIT 或 ROLLBACK否则一个事务绝不会结束
3、为与ASE兼容,可把Adaptive Server Anywhere设置为非链式模式 (隐含地实现 COMMIT)


交互式 SQL 及 COMMIT(提交) :
1、交互式SQL具有自动提交的选项:
a>;使在每个命令之后自动提交
模拟非链式模式
b>;完成现有的交互式 SQL时自动提交

2、千万留神!你正在使用的是什么选项
SET OPTION auto_commit = 'on‘;
SET OPTION commit_on_exit = 'on‘;
SET PERMANENT;


COMMIT and ROLLBACK:
1、COMMIT 让修改永久化
该事务中的所有语句都被执行成功了
2、ROLLBACK 把所有的改变全部复旧(undo)
事务中的任何语句失败时

SELECT . . .;
UPDATE . . .;
IF . . . THEN COMMIT
ELSE ROLLBACK
END IF;

要考虑应用的可移植性 :

1、为避免在不同模式中的二意性,应当:
a>;每个事务都用 BEGIN TRAN开始
b>;每个事务都用 COMMIT 或 ROLLBACK结束

实例
BEGIN TRANSACTION;
UPDATE…;
INSERT…;
COMMIT TRANSACTION;

保存点 :
1、用来界定在一个事务中一组逻辑上相关的任务
2、使得能根据某种条件逻辑仅把事务中的一部分进行回滚
3、保存点可被嵌套
4、在数据行数较多的事务中很有用

建立保存点 :
语法
SAVEPOINT savepoint-name;
实例
SAVEPOINT spt_abc;

回滚到保存点:

1、把自该保存点之后完成的工作全部复旧(undo)
ROLLBACK TO SAVEPOINT [savepoint-name];
2、例 1 — 回滚到 spt_123
SAVEPOINT spt_abc;
INSERT…;
SAVEPOINT spt_123;
UPDATE…;
ROLLBACK TO SAVEPOINT spt_123;

3、例 2 — 回滚到 spt_abc
SAVEPOINT spt_abc;
INSERT…;
SAVEPOINT spt_123;
UPDATE…;
ROLLBACK TO SAVEPOINT spt_abc;



释放保存点 :
1、从激活的保存点清单中删去保存点
2、仍能回滚到一个已释放的但命了名的保存点
3、并不释放任何锁 锁在整个事务期间都被保持


例 1 —释放最近的保存点
RELEASE SAVEPOINT;
例 2 —释放保存点spt_abc
RELEASE SAVEPOINT spt_abc;

事务处理 :

1、作为一个事务看待的逻辑上相关各SQL语句必须作为单个工作单元来执行 2、当系统故障时事务中的数据必须被恰当地恢复
3、并发作用于同一数据上的各事务在执行时不可破坏数据一致性

提交保存点完成的改变 :
1、只要事务尚未被提交,自某些特定的保存点之后完成的改变都能被回滚。
2、仅当整个事务被提交时,才提交各保存点的改变。


回滚日志(Rollback Log)
用于保证事务的原子性!

1、储存在内存及该数据库文件中
2、包含被事务修改了的各数据行的前映象及“逆向SQL”操作
3、当事务被提交或回滚时,属于该连接的回滚日志被抹去.


事务结束:
COMMIT — 回滚日志被释放
ROLLBACK — 利用回滚日志重置以前的值


事务的并发性 :
1、事务之间会造成彼此干扰
2、利用锁和阻塞机制来处理这种干扰  


锁机制:
1、防止并发事务彼此造成干扰
2、自动实现行级锁
3、封锁被保持到COMMIT 或 ROLLBACK
4、四种锁: 写 插入 读 幻象(Phantom)
5、两大类: 共享(Shared) 排它(Exclusive)

共享锁:

1、读锁
a>;对一个具有读锁的行其它事务仍可对该行获得读锁
b>;防止写锁
c>;不能对具有写锁的行获得读锁
2、幻象(Phantom)锁
a>;防止在幻象锁行之前马上插入数据
b>;在利用索引查询和进行表扫描时使用它
c>;幻象锁会降低写入性能

排它锁:

1、写锁
a>;对含有写锁的行,其它事务再也不能获得任何类型锁。
b>;对含有任何类型锁的行,其它事务再也不能获得写锁。
2、插入锁
a>;获得往一个特定位置插入一行的权力
b>;当利用读锁防止其它事务的更新或删除时,同时获得插入锁。


事务的阻塞:

1、排他锁会产生潜在的冲突
第二个事务所请求的资源已被另一个事务的封锁给阻塞
2、解决冲突的办法是:
a>;让第二个事务等待
b>;迫使第二个事务的锁请求失败

阻塞的配置:

1、BLOCKING ON 迫使事务等待
2、BLOCKING OFF 迫使事务的锁请求失败
3、实例:
SET OPTION BLOCKING = 'OFF'
SET OPTION BLOCKING = 'ON'

权衡:
1、BLOCKING OFF 适用于DSS应用(事务中涉及大量数据)
迫使事务请求失败
2、BLOCKING ON 适用于OLTP应用(事务短小) 潜在地会产生死锁

死锁:
1、两个以上的事务竞争同样的资源
2、一组事务同时进入了无法获得某种资源而继续进行下去的状态。
3、BLOCKING 是 ON
4、死锁的两种类型:
a>;循环阻塞
b>;线索阻塞
5、牺牲最后一个被死锁的事务


循环阻塞:
1、各事务彼此等待对方已占有的资源
2、除非获得它们所需资源否则事务处于阻塞状态
3、被阻塞的事务不会释放锁
4、形成死锁解决办法:
a>;自动发现死锁
b>;第一个事务继续下去
c>;把最后一个被阻塞的事务回滚
必须让客户应用能发现这种情况并且重新提交该事务

如何减少循环阻塞:

1、都按约定的次序 (比如按字母顺序)对多个表进行更新
2、事务应尽可能地小(只把确实必须作为一个工作单元的,以原子化方式执行的操作放在同一个事务中)。

线索阻塞:
1、在数据库引擎中全体可激活的执行线索(缺省值为20个)
2、被阻塞的事务并不释放执行线索
3、形成死锁解决办法:
a>;自动发现死锁
b>;把最后被阻塞的事务回滚
c>;较早的事务利用释放的线索继续下去


如何减少线索阻塞
1、事务应尽可能地短小
2、利用 -gn 参数增加数据库线索
dbsrv7 -gn 50 mydata


隔离级别:

1、指定读封锁的级别
2、读锁是可以选择的
3、较低的隔离级别会导致数据的不一致性
4、四个隔离级别
a>;级别 0 ( Adaptive Server Anywhere的缺省级别)
b>;级别 1 (ASE的缺省级别)
c>;级别 2
d>;级别 3


级别 0 :
1、不管数据行是否具有写锁都可读取
2、无法保证并发的事务又对该行进行修改或是把修改又给回滚
级别 1 :
1、允许读取未加写锁的数据行
2、仅在并发地读取该行时施加并保持读锁
3、不能保证在整个事务期间该行数据不再改变
级别 2:
1、仅能读取未加写锁的数据行
2、施加读锁后要一直保持到事务结束
级别 3 :
1、仅能读取不含写锁的结果集中的数据行
2、对结果集中的每一行及其用到的每一个索引都施加读锁且保持到事务结束

ODBC 用法 ?

ANSI级别        ODBC       主要特性   
    O                  RU      读未提交的事务
    1                   RC     读已提交的事务
    2                   RR     可重复读
    3                   TS     事务串行化


事务并发性和一致性:

low                    consistency                   high
                                                        isolation level 3
                                 isolation level 2
                 isolation level 1
isolation level 0
low                    concurrency                   high



脏 读:

一个事务读取了被并发事务作了修改但后来又作了回滚的数据行

事务 A 修改数据行
事务 B 读取该行
事务 A 执行了回滚
由此,事务 B 获得了一个无效的(脏)数据。

无法重复读:

在一个事务中,对同一数据行读取多次,但各次获得不同结果。
事务 A 读取一行数据
事务 B  对该行作了更新或删除并且提交了其改变
事务 A  又来读该行
在第二次,事务 A 获得不同的数据或者错误码

幻想行:

在一个事务中对同一数据行集合读取多次,但各次获得不同结果

事务 A 利用 WHERE子句选取一组数据。
事务 B 对满足事务A中 WHERE 条件的数据行又执行了插入,更新或删除操作。
事务 A 仍利用同样的 WHERE子句来选取数据。
在第二次,事务 A 获得不同的结果集。


隔离级别的选择:
1、级别 0 (RU)
允许脏读,无法重复读及出现幻象行。
适用于读取大量数据的应用中。
2、级别1 (RC)
防止脏读
允许无法重读及幻象行
适应于读取大量数据的应用中
3、级别 2 (RR)
防止脏读及无法重复读
允许幻象行
适应于要求事务处理串行化的应用中
4、级别 3 (TS)
防止脏读
无法重复读及幻象行
适应于要求事务处理串行化的应用中

推荐作法:
1、利用较低的隔离级别作为缺省
2、针对事务中致关重要的读操作设置为更高的级别
3、应当及时降回到较低隔离级别


小     结
1、一个事务是一组逻辑上相关并要求作为一个原子化的工作单元来完成的任务。
2、一个保存点是在一个事务中的一组逻辑上的相关的任务。
3、Adaptive Server Anywhere 利用回滚日志( 回滚日志)来保证一个事务作为一个整体被完成,如果不能被成功地完成则全部复旧。
4、当 Adaptive Server Anywhere 在系统故障之后被重新启动时,它能利用校验点,事务日志及回滚日志自动把数据恢复到一致状态。
5、为防止并发事务彼此进行干扰, Adaptive Server Anywhere 自动实现行级封锁。
6、排它锁潜在地使事务间产生冲突。

使用道具 举报

回复
论坛徽章:
2
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442017金鸡报晓
日期:2017-01-10 15:33:11
17#
 楼主| 发表于 2007-11-13 23:08 | 只看该作者
Adaptive Server Anywhere 7.0网上培训教材


存储过程

目标 :
1、定义存储过程
2、建立一个简单存储过程
3、讨论存储过程的优点和缺点
4、通过实例介绍Adaptive Server Anywhere对SQL的过程化扩展
5、说明存储过程的结构
6、定义一个复合语句
7、解释输入参数与存储过程返回的结果集之间的差别



内容
1、关于存储过程
2、建立存储过程
3、过程化语言
4、调用存储过程

存储过程:
1、SQL 语句和流程执行语句
2、仅允许间接存取数据
3、封装着公用的: 算法和事务
4、它被存储在系统表 SYSPROCEDURE中
5、仅在该过程第一次被执行时进行编译
6、可接收输入参数
7、可调用其它存储过程
8、可返回状态值
9、可返回输出参数或结果集

存储过程的优点 :

1、改善性能
2、提高安全性
3、减少网络交通量
4、提高开发人员的生产率
5、能充分发挥专家的作用
6、简化了应用的维护
7、应用的灵活性
8、确保算法的一致性
9、数据透明性

存储过程的缺点:

1、可能加重了服务器方的负载
2、要注意对该共享资源的管理以免造成并发冲突
3、可移植性差

存储过程的结构 :
在CREATE PROCEDURE 语句中可包含:
1、过程参数清单的说明
2、结果集
3、过程体,它由复合SQL语句构成

存储过程的结果:
1、OUT 或 INOUT 参数
2、结果集
3、允许存储过程返回多个列和行
4、RETURN 状态
5、允许你无条件地退出一个存储过程,同时返回一个特定的状态值。

CREATE PROCEDURE:

1、CREATE PROCEDURE
进行语法分析 存入系统表 SYSPROCEDURE
2、直到被调用时才被编译
然后建立存取计划并存储在内存中
在ASE中,你必须以明显方式指明要进行编译。
3、基本语法 CREATE PROCEDURE procedure-name  ([IN | OUT | INOUT] parameter-name datatype [DEFAULT expression], …) [RESULT (result-col1, result-col2, ...)] compound-statement

实例 :
CREATE PROCEDURE big_num
(IN a INT, IN b INT, OUT c INT)
BEGIN
IF a >; b
THEN
SET c = a;
ELSE
SET c = b;
END IF;
END;

参数列表清单 :
1、用来向存储过程传送值或接受存储过程返回值
2、参数的定义
种类: IN, OUT 或 INOUT
名字: 要遵守数据库标识符约定
数据类型: 任何有效的Adaptive Server Anywhere 数据类型
可给出 DEFAULT 值
3、在掉用该存储过程时,必须为每个参数提供一个值。

为参数赋值 :

1、SET 语句
2、SELECT INTO 语句

实例:
CREATE PROCEDURE order_count
(IN @customer_id INT, OUT @orders INT)
BEGIN
SELECT COUNT("dba".sales_order.id)  INTO @orders FROM "dba".customer KEY LEFT OUTER JOIN "dba".sales_order WHERE "dba".customer.id = @customer_id;
END


结果集 :
1、允许一个存储过程返回多行
2、实例 1 — 返回客户的 ID和订单
CREATE PROCEDURE customer_orders( )
RESULT (customer_id INT, order_count INT)
BEGIN  
SELECT "dba".customer.id, COUNT( "dba".sales_order.id )  FROM "dba".customer KEY LEFT OUTER JOIN   "dba".sales_order GROUP BY "dba".customer.id;
END;

3、还可由多个SELECT 语句返回数据
4、结果集中必须: 列的数目相同 有相同的数据类型 (或是可进行隐式转换)
5、T-SQL 可以包含动态的结果集
6、实例 2 — 返回客户和联系人的清单
CREATE PROCEDURE custs_and_contacts ( )
RESULT (lname CHAR (36), fname CHAR (36))
BEGIN
SELECT lname, fname FROM "dba".customer;
SELECT last_name, first_name FROM "dba".contact;
END;


组合语句 :

1、用在过程本体中
被BEGIN 和 END所包围
2、可包含局部说明,它仅在组合语句的上下文中有效。
局部说明可被嵌套的子句所访问
3、被内部语句所使用的资源要在它们的语句的 END处才释放
4、实例:
CREATE PROCEDURE someproc ( )
  BEGIN
    DECLARE x INT;
    DECLARE y INT;
    SELECT count(*) INTO x FROM TableA;
    SELECT count(*) INTO y FROM TableB;
    BEGIN
      DECLARE z INT;
      CALL greater (x, y, z);
      PRINT ‘z = %1!’, z;
      END;
END;


编写存储过程的注意事项 :

1、校验命令分隔符
2、语句的分隔
使用分号
3、应采用完全受限命名
4、应采用无二意性的日期和时间格式


过程化语言 :

1、Adaptive Server Anywhere 过程化扩展
说明语句
条件语句
反复循环语句
分支语句
错误处理指令
2、编写存储过程就类似于编程序

说明语句 :
1、BEGIN, END
2、DECLARE, SET
3、说明: 变量 表达式 语句块
4、赋值

BEGIN 和 END:
1、定义一个组合语句
2、可包含局部变量,游标,临时表及表达式。
3、语法
BEGIN [ATOMIC]


END
4、实例
BEGIN
UPDATE product  SET unit_price = 1.25 * unit_price;
UPDATE employee  SET salary = .95 * salary;
END;


原子化多个SQL语句 :
1、这些语句或是全部完成或是一个也不做
2、确保数据的一致性
3、使用 BEGIN ATOMIC 语法
4、实例:
CREATE PROCEDURE update_dept(IN @old_dept_num INT, IN @new_dept_num INT, IN @new_dept_name CHAR (40), IN @new_dept_head_id INT)
BEGIN ATOMIC
    INSERT INTO department (dept_id, dept_name,    dept_head_id)   VALUES (@new_dept_num, @new_dept_name, @new_dept_head_id);
    UPDATE employee  SET dept_id = @new_dept_num
    WHERE dept_id = @old_dept_num;
    DELETE FROM department
    WHERE dept_id = @old_dept_num;
END ;

DECLARE:

1、说明变量,游标,临时表及表达式。
2、利用SET设置初始值
3、必须紧跟在一个 BEGIN 语句之后
ASE的T-SQL 允许在存储过程中的任何点使用 DECLARE

DECLARE variable-name datatype;
SET variable-name expression;
DECLARE LOCAL TEMPORARY TABLE table-name (table-definition) •[ON COMMIT {DELETE | PRESERVE} ROWS]

4、实例:
BEGIN
  DECLARE discount numeric (6,2);
  SET discount = .15;
  SELECT discount * unit_price FROM product;
END
BEGIN
  DECLARE LOCAL emp_temp (emp_fname char(20), emp_lname  char (20) ON COMMIT DELETE ROWS);
END


条件语句 :

1、根据前面的语句来改变执行流程
2、IF
3、CASE
4、RETURN (经常是伴有条件来使用)

IF 语句 :
1、当一个条件为 TRUE(真)时准许执行
2、ELSE 子句是当一个条件为 FALSE(失败)时准许执行
3、ELSE IF 准许附加的条件
4、语法:
IF search-condition1 THEN statement-list1;
[ELSEIF search-condition2
THEN statement-list2];
[ELSE statement-list3];
END IF;

5、实例
IF @color = red
THEN SELECT * FROM product  WHERE color = 'red';
ELSEIF @color = blue
THEN
SELECT * FROM product  WHERE color = 'blue';
ELSE SELECT * FROM product;
END IF;


CASE 语句 :

1、利用WHEN子句指明多个条件
2、ELSE子句是用于如果没有一个WHEN子句能成为 TRUE时
3、语法:
CASE value-expression
WHEN constant1 THEN statement-list1
WHEN constant2 THEN statement-list2
WHEN constant3 THEN statement-list3
ELSE statement-list4;
END CASE;

4、实例
CASE @id_type
WHEN 'cust' THEN
SELECT id  FROM customer
WHEN 'dept' THEN
SELECT dept_id   FROM department
WHEN 'contact' THEN
SELECT id  FROM contact
ELSE
SELECT emp_id FROM employee;
END CASE;

RETURN 语句:

1、导致立即退出一个存储过程
2、可带有表达式以向调用者返回单个值
3、语法:
RETURN [表达式]
4、实例:
IF  @quantity =>;1
THEN
UPDATE sales_order_items  SET quantity = @quantity;
ELSE RETURN 'You must enter a quantity';
END IF;


反复循环语句:

1、请看Adaptive Server Anywhere参考手册第9章:SQL语句
2、 LOOP 语句 [WHILE…] LOOP
3、其中 WHILE 条件是选项
4、FOR (用在游标中)


WHILE…LOOP:

1、只要WHILE条件为TRUE则不断地重复执行
2、语法
[statement-label:]
[WHILE condition] LOOP
statement-list
END LOOP [statement-label]

3、实例:
SET @total = 0;
SET @num_items = 0;
INSERT INTO total_temp VALUES (0,0);
loop1:
WHILE @total < 100.00 LOOP
UPDATE total_temp SET num_items = @num_items;
SET @total = @total + SELECT unit_price FROM product WHERE id = @product_id;
SET @num_items = @num_items + 1;
END LOOP loop1;
SELECT num_items from total_temp;
END;


分支语句:

1、改变执行流程
2、LEAVE
3、CALL

LEAVE:
1、结束一个过程循环
2、要求一个语句标号
3、语法:
LEAVE 语句标号
4、实例:
SET @total = 0;
SET @num_items = 0;
INSERT INTO total_temp VALUES (0,0);
loop1:
WHILE @total < 100.00 LOOP
UPDATE total_temp SET num_items = @num_items;
IF @total >; 100.0
THEN LEAVE loop1;
END if;
SET @total = @total + SELECT unit_price
FROM product WHERE id = @product_id;
SET @num_items = @num_items + 1;
END LOOP loop1;
SELECT num_items from total_temp;
END;

CALL:
1、调用一个存储过程
2、语法:
CALL存储过程名  (参数名值 ,…);
3、实例:
CALL sp_sales_order (23345, 1923;

错误处理 :

1、缺省的错误处理
   向调用者返回出错消息
2、例外处理
   允许存储过程在内部处理错误
   并不向调用者返回出错消息
   关键词EXCEPTION
3、ON EXCEPTION RESUME
     用在 CREATE PROCEDURE
     既使出现例外也允许存储过程继续运行
   适用于大型的批作业中
4、SIGNAL
    人为地制造一个意外(它不是属于Adaptive Server Anywhere的一种意外状态)
   适用于对存储过程的测试
   语法:  SIGNAL exception-name
5、CREATE MESSAGE
     建立一个用户定义的出错消息。
   语法: CREATE MESSAGE message-num AS 'message text'
6、sp_addmessage
     增加一个包含用户定义的出错号码的用户定义消息
    CALL sp_addmessage (error-number, ‘format-string parameters’)
7、RAISERROR
     类似于 SIGNAL
     此外还明确地给出并非来自数据库缺省说明中的实际出错消息
    RAISERROR error-number, 'format-string parameters'



删除存储过程 :
1、必须是DBA或存储过程的主人
2、语法:
DROP PROCEDURE procedure-name;
3、实例:
DROP PROCEDURE myproc;

调用存储过程 :
1、在CALL语句中给出存储过程名
参数可按名字或按位置次序来赋值
2、语法:
CALL procedure-name ([parameter-name =] expression, …)
3、实例:
CALL update_dept (123, 12300, 'Accounting', 987)


存储过程查询计划 :

1、存储过程在它第一次被执行时进行编译
2、在数据库运行时被编译好的代码和查询计划被保留在内存中
3、在第一次执行时应确保:
各索引已安排好
各参数取值的数据类型要符合于用户实际的需要

小结 :

1、存储过程中包含SQL语句及对SQL的过程化扩展.
2、存储过程可以接受参数,调用其它存储过程,返回一个状态值或参数及结果集。
3、Adaptive Server Anywhere支持的过程化扩展包括说明语句,条件语句,循环语句,分支语句和错误处理命令。
4、具有RESOURCE 权限的用户才能建立存储过程
5、执行 CREATE PROCEDURE 语句,导致让 Adaptive Server Anywhere 进行语法分析并把该存储过程存入系统表SYSPROCEDURE。
6、调用一个存储过程则导致 Adaptive Server Anywhere 从系统表中检索该存储过程,如果自数据库启动以来它是第一次被调用则对它进行编译。


复习题 :
1 用实例说明Adaptive Server Anywhere所支持的两类用于存储过程的对SQL的过程扩展语句。
2. 说明存储过程的结构
3. 说明存储过程输入参数与返回结果集之间的差别
4. 建立存储过程需要有什么权力?
5. 删去存储过程需要有什么权力?
6. 调用存储过程需要有什么权力?


注明:存储过程方面的内容和ASE有很大的区别,这点需要特别注意!

使用道具 举报

回复
论坛徽章:
2
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442017金鸡报晓
日期:2017-01-10 15:33:11
18#
 楼主| 发表于 2007-11-13 23:08 | 只看该作者
Adaptive Server Anywhere 7.0网上培训教材


触发器

目标
1、定义触发器
2、解释触发器的使用
3、讨论使用触发器的优点
4、列出并说明Adaptive Server Anywhere所支持的四类触发器
5、Adaptive Server Anywhere所支持的两种触发器激发时机是什么?
6、触发器的结构
7、建立触发器


内容
1、触发器
2、触发器的使用
3、触发器的类型
4、触发器的实现

定义触发器
1、它是服务器方的编程,用以制约数据完整性
2、它由SQL及流程扩展语句构成
类似于存储过程
3、是自动执行的
4、与引发它的事务一起被提交或回滚的
5、继承着该表建立者的权限

触发器的用途
1、利用触发器能实现:
A>;对DDL而言过分复杂的数据数据完整性规划
B>;在数据项间存在逻辑关系的业务规划
C>;自动进行数值修改
D>;审计

制约数据完整性
1、触发器支持
A>;声明参照完整性
B>;缺省值
C>;NOT NULL 约束
D>;CHECK 条件
E>;主键


触发器的优点
1、独立于客户应用对数据库的访问
2、标准化 集中于中央位置实现各种规则
3、高效性 编码是已编译的
4、安全性 用户和应用无法回避触发器


触发器的类型
1、事件驱动的—当发生如下事件时可自动激发触发器
插入
删除
更新 当任何一列被更新都激发
列更新 仅当特定的列被更新时才激发它

触发器作用范围和时间
1、行级触发器 在每行之前或之后
2、语句级触发器 在整个操作完成之后
3、可激发同类型的多个触发器
一下子全部激发 按特定的次序来激发

建立触发器
1、由组合语句构成 与存储过程具有同样的能力及特点 触发器不能包括参数和返回结果集
2、语法
CREATE TRIGGER trigger-name trigger-time trigger-event
FOR EACH [ROW | STATEMENT]
BEGIN
...;
...;
END

3、建立触发器的用户应具有以下权限 RESOURCE 权 对所需表的ALTER 权限


插入型触发器
1、实例 — 禁止增加一个已被解雇的新职员
CREATE TRIGGER ai_employee AFTER INSERT ON employee REFERENCING NEW AS new_emp FOR EACH ROW
BEGIN
IF new_emp.termination_date IS NOT NULL
THEN
      RAISERROR 30000 'You cannot hire an employee you have already fired';
  END IF;
END

删除型触发器
1、实例 — 禁止删除一个还未期满的雇员
CREATE TRIGGER d_employee BEFORE DELETE ON employee REFERENCING OLD AS cur_emp FOR EACH ROW
BEGIN
IF cur_emp.termination_date IS NULL
   THEN
     RAISERROR 30001 'You cannot delete an employee who has not been fired';
END IF;
END

更新型触发器
1、实例 — 职员工资升不许降
CREATE TRIGGER bu_employee BEFORE UPDATE ON employee
REFERENCING NEW AS after_update OLD AS before_update
FOR EACH ROW
  BEGIN    IF after_update.salary < before_update.salary THEN
       RAISERROR 30002 'You cannot decrease a salary';
END IF;
END



列级更新触发器
1、实例 — 工资只可增加,仅当更新salary列时才激发触发器
CREATE TRIGGER ub_empsal BEFORE UPDATE OF salary ON employee
REFERENCING NEW AS after_update OLD AS before_update
FOR EACH ROW
   BEGIN
    IF after_update.salary <  before_update.salary
    THEN         RAISERROR 30002 'You cannot decrease a salary';      
   END IF;

END


删去一个触发器
1、语法
DROP TRIGGER trigger-name
2、实例
DROP TRIGGER mytrigger
3、要求对表有 ALTER 权限



触发器的执行时机
1、当数据库出现相应动作时自动被执行
2、操作次序:
BEFORE 触发器
参照动作
操作
AFTER 触发器

对ASE 触发器兼容性的考虑
1、回滚
   Adaptive Server Anywhere不支持触发器内的回滚
   在ASE(或 T-SQL)的触发器中可包含回滚
   触发器与激发该触发器的操作是原子化的,如果此触发器失败则该操作也自动失败。
2、嵌套
   一个触发器所执行的动作导致激发另一个触发器
   Adaptive Server Anywhere 对嵌套层数未作明确限制
   除非Adaptive Server Anywhere运行资源超出,ASE 给出可配置的最大限制数 缺省值是16

3、递归性
Adaptive Server Anywhere触发器可被设置为递归激发
如果一个触发器执行动作会使本身又被激发,则导致递归激发。
缺省情况是off
用IF UPDATE() 来处理递归
在ASE 及与 T-SQL 兼容的触发器中不具有此特点

小结
1、触发器由SQL及流程控制语句构成 ,当触发器所检测的事件发生时自动执行该触发器。
2、在制约复杂的完整性和一致性规则以及实现维持数据间逻辑关系的业务规划时,采用触发器是很有效的。
3、触发器的主要优点是:标准化,高效性和安全性。
4、有四类触发器:插入型,删除型,更新型及列级更新型。
5、行级触发器的执行时机是在触发器操作所影响的每一行在被改变之前或其后。
6、建立触发器用命令CREATE TRIGGER,删除触发器使用命令 DROP TRIGGER。它们都要求用户具有适当的权限。

使用道具 举报

回复
论坛徽章:
2
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442017金鸡报晓
日期:2017-01-10 15:33:11
19#
 楼主| 发表于 2007-11-13 23:09 | 只看该作者
Adaptive Server Anywhere 7.0网上培训教材


备份与恢复

目标
1、讨论防止数据损坏的三种预防措施
2、说明可考虑的几种备份策略
3、标明哪些类型的故障可被Adaptive Server Anywhere恢复
4、说明Adaptive Server Anywhere在出现校验点时都作些什么
5、修理一个出毛病的事务日志或镜象文件
6、恢复出现系统故障后的Adaptive Server Anywhere数据库
7、恢复出现含有数据库文件或事务日志介质故障后的Adaptive Server Anywhere数据库
8、删去一个Adaptive Server Anywhere数据库文件
9、缩和解压缩Adaptive Server Anywhere数据库文


内容
1、保护数据的预防措施
2、备份数据库
3、故障恢复
4、Adaptive Server Anywhere的日志
5、系统故障的恢复
6、介质故障的恢复
7、其它的维护手段

保护数据的要点:

1、按着规定经常备份数据库
2、把事务日志放在份开的设备上
3、对至关重要的数据采用放在份开设备上的事务日志镜象

备份数据库:

1、两种格式
完全备份 --数据库及日志
增量备份 --仅备份日志

2、两种方法
联机 (每周 7天,每天 24小时均可进行 )
完全备份
增量备份


备份策略 :

1、考虑因素:
数据丢失会造成的危险
那种数据丢失风险是可接受的
不同的备份策略各有什么优缺点
对数据可用性的要求

备份和恢复策略
1、备份和恢复策略必须是相容的
检查备份和恢复策略
它们是否能像所期望的那样工作?
是否能获得正确的结果?
是否能满足业务要求?

完全备份
1、对数据库及事务日志都做拷贝
2、是最简单的备份策略
3、常用于相对小的数据库
4、对大型数据库是不切合实际的

增量备份
1、使用周期
完全备份数据库和事务日志文件 随后只备份事务日志 定期地重新开始这个周期
2、周期过长则增加了数据丢失的风险,因为事务日志的备份有可能会丢失或损坏。重要的是要把日志备份存储在可靠的介质上

3、通常用于大型数据库


联机备份 :
1、无须停止数据库引擎就可完成
2、提供一致性的数据库快照
3、通常用于要求高可用性的数据库
4、可进行完全备份或增量备份


脱机备份
1、要在数据库引擎停机后来完成
2、当允许数据库引擎常规地停机时可采用此办法
3、可进行完全备份或增量备份




实施备份
1、Adaptive Server Anywhere提供实用程序dbbackup来完成联机备份 2、脱机备份要利用操作系统中的文件拷贝命令完成
3、在实施备份之前,应当利用实用程序 dbvalid 对数据库进行合理性校验。 如果该数据库是不合理的:
把它复原到最近的完好的备份
利用事务日志施加恢复
再立即对其作备份


联机备份的实施
语法:
dbbackup [开关] 目录
-c 设置连接参数
-d 仅备份数据库文件
-r 重命名日志并启动新的一个
-t 仅备份日志
-x 删去日志并启动新的一个



故障类型 :

1、系统故障
数据库不可用了,它并未遭破坏
无须人工干预
系统能自其故障处进行恢复
恢复可能要花费一些时间
2、介质故障
数据可能被损坏了
要使用数据库文件备份来解决
把主数据库文件和事务日志文件散布在不同的物理设备设备上


Adaptive Server Anywhere的自动恢复

利用日志和事务恢复机制
仍需要实施常规的数据库文件备份才能有效
应把数据库文件与事务文件放在不同的物理设备上


Adaptive Server Anywhere日志:
校验点日志
回滚日志
事务日志
事务日志镜象


校验点日志 :
其中包含自最近一个校验点以来所有的被修改的物理数据页(脏页)的前映象
在Cache 中包含脏页的后映象

每个数据库有一个校验点日志,直到下一校验点出现,它一直存在于数据库中。

使用道具 举报

回复
论坛徽章:
2
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442017金鸡报晓
日期:2017-01-10 15:33:11
20#
 楼主| 发表于 2007-11-13 23:09 | 只看该作者
校验点:

1、刷新 cache 中所有的脏页并把它们写入数据库文件中

2、出现的时机:
在数据库引擎停机时
自最近一个校验点之后 >; CHECKPOINT_TIME
估算恢复所用时间 >; RECOVERY_TIME
数据库引擎已空闲了足够的时间
事务中发出CHECKPOINT命令
未利用用事务日志而把事务提交给数据库时


校验点数据库选项:

1、利用 SET OPTION设定 当数据库引擎再次启动时起作用

2、CHECKPOINT_TIME 校验点之间的最大间隔 缺省值 = 60 分钟

3、RECOVERY_TIME
自失败到完成恢复经过的最大时间间隔
缺省值 = 2 分钟

回滚日志:

1、储存已修改了的数据的前映象及 SQL 需要复旧的修改
2、每个打开的连接有一个回滚日志
当事务被提交或回滚之后被释放
3、在内存中被建立,当出现校验点时被拷贝到数据库文件。


事务日志 :

1、对数据库的每一个修改,都按其发生的次序在事务日志中储存一条记录。
各数据库使用一个激活的事务日志
还可能存在着其它的归档(archive)日志

2、应当把它建立在与数据库文件使用不同的控制器的另外的设备上
当出现介质故障时能提供最好的可恢复性

改变事务日志的位置

1、利用 Sybase Central 或 dblog 实用程序

2、必须在数据库停止状态下才能改变日志位置

3、推荐:
设备分开  设备分开

4、实例   dblog -t d:\newdir\mydata.log c:\mydata.db


利用 Sybase Central改变日志位置:

1、打开 Utilities 文件夹
2、双击 Change Log File Information
3、 输入数据库文件位置
4、选择 Create new or rename existing log file 并打入新的位置
5、 如有必要,可输入镜象日志位置
6、 如有必要,可改变 Transaction Log offsets。
7、 设置选项
8、 选择是否删去老的日志文件



事务日志镜象 :
1、是对事务日志的全同拷贝 与事务日志同时被写入
2、应当放置在分开的物理设备上
3、语法— 增加一个事务日志镜象 dblog -m mirror-name
4、在 Sybase Central中,利用修改日志信息的实用程序。

事务日志有效性?


事务日志和镜象恢复 :

依次执行以下几步:
1、确定哪些部分出了毛病
2、备份完好的文件
3、把完好的文件拷贝到出毛病的文件
4、重新启动数据库引擎


识别有问题的文件 :
1、拷贝数据库备份
2、传送事务日志和镜象
完好文件能不出问题的完成
出毛病的文件会产生错误消息
3、比较两个事务日志
4、使用磁盘实用程序来找出毛病
5、语法: dbtran log-file output-file
6、Sybase Central
打开 Utilities文件夹
双击 Translate Log
指明要传送的日志文件
指明输出文件
给定选项


系统故障的恢复 :
1、运行磁盘验证实用程序
2、重新启动数据库引擎
   根据校验点日志把数据复原到最近的校验点状态
   根据事务日志把自校验点到出故障之间完成的修改都再实施一次
   根据回滚日志把未提交的事务回滚

介质故障的恢复 :

1、修复故障设备
2、修复数据库
修复手段取决于数据库或日志设备是否受损



数据库文件的介质故障 :
1、一个事务日志
自最后一次完全数据库备份以来从未做过备份
2、多个事务日志
自最后一次完全数据库备份以来已做过备份


利用一个日志进行恢复:
1、对当前的事务日志做系统文件拷贝
2、复原最新的对数据库文件的完全备份
3、启动数据库时采用 –a 开关并给出用以恢复的日志的名字
4、对已恢复的数据库作备份
5、再利用一个新的事务日志启动数据库引擎
6、实例:
dbsrv7 mydata.db -a mydata.log

利用多个日志进行恢复:

1、对当前的事务日志做系统文件拷贝
2、复原最新的对数据库文件的完全备份
3、针对早期的多次日志,多次启动数据库引擎每次都采用开关 -a ,但按时间次序份别给出不同的日志名字。
4、备份已恢复的数据库
5、再利用新的事务日志启动数据库引擎
   另一种作法是,把最新的日志名重命名为恰当的名字。

6、实例:
dbeng7 class.db -a d:\oldlogs\mon.log
dbeng7 class.db -a d:\oldlogs\tue.log
dbeng7 class.db -a d:\oldlogs\wed.log
dbeng7 class.db -a d:\backup\class.log


存放事务日志的介质故障 :
1、数据丢失的可能性非常大
事务日志的介质故障之后的系统故障会导致损坏日志

2、应当使用放在分开设备上的日志镜象

3、备份完好的数据库文件

4、删除事务日志

5、利用 –f (无日志)开关重新启动完好的数据库

把数据库复原到最近的校验点处
对该校验点之前未提交的一切事务都进行回滚
启动一个新的事务日志

6、备份已恢复的数据库

7、利用新的事务日志重新启动数据库



恢复未提交的修改 :

1、利用带 -a 开关的dbtran 实用程序把事务日志的内容转换为一些可读的SQL 语句

2、留神:回退事务常常是不完整的,未必需要恢复所有的未提交的事务。

3、例如:
   dbtran -a class_db.log changes.sql
     恢复未提交的事务
   在输出文件中包含回滚事务
   输出文件change.sql是可读的 SQL 文件
   你可对其进行编译,使其仅包含你打算回滚的未提交事务。

用于数据库维护的其它实用程序 :

1、dberase
删去数据库文件
2、dbshrink
把数据库文件压缩为一个压缩了的,只读格式
3、dbexpand
把被压缩的数据库展开
4、dbwrite
把对一个只读数据库所作的修改都储存在一个新建的可写入文件中
日后可利用该可写入文件再对压缩了的数据库进行修改:
Translating the write log (.WLG)
Applying the resultant SQL to the database



删去数据库 :

1、交互式SQL语法  DROP DATABASE 文件名

实例 : 这个语句是不进行再次确认的删去数据库 mydata.db :
DROP DATABASE 'c:\mydata.db'

2、dberase (命令行)
这个命令是不做再次确认的删去数据库 mydata.db :
dberase -y c:\mydata.db


删去数据库文件 :

Sybase Central
1. 打开 Utilities 文件夹
2. 在右半边, 双击 Erase Database.
3. 点击 Next.
4. 必要时,改变数据库连接。
5. 点击 Next.
6. 打入你要删去的数据库或可写入文件的名字.
7. 点击 Next.
8. 点击 Finish 则删去数据库


压缩数据库文件:

压缩数据库文件
压缩后的数据库文件是只读的
被压缩后的数据库文件能紧缩 40-60%  
利用 dbwrite来搜集对已压缩数据库的修改
利用 dbexpand进行解压


实际应用 :
准备发送给客户的含有定货项目和其价格的数据库
可把该数据库存放在 CD-ROM这类只读介质上

dbshrink:

语法:dbshrink [switches] database-file [compressed-database-file]

实例:

dbshrink –q mydata.db
-q — 静止模式,抑制消息。
此时,压缩文件的缺省名为:mydata.cdb

利用 Sybase Central 压缩数据库:

1. 打开 Utilities 文件夹
2. 在右半边双击 Compress Database
3. 点击 Next
4. 必要的话,改变你的数据库连接。
5. 点击 Next
6. 输入要压缩的数据库名及存储已压缩数据库文件的位置
7. 点击 Finish  


dbexpand:

语法:
dbexpand [switches] compressed-database-file  [database-file ]

实例 :
dbexpand –o uncompress.msg  mydata.cdb mydata_big.db

-o — 把消息输出到名为 uncompress.msg 的文件中
展开后的数据库文件名为 mydata_big.db

利用 Sybase Central展开数据库:

1. 打开 Utilities 文件夹
2. 在右半边,双击 Uncompress Database
3. 点击 Next
4. 必要的话,改变你的数据库连接。
5. 点击 Next
6. 输入要展开的数据库名及存储已展开数据库文件的位置
7. 点击 Finish  

记录对只读数据库所做的修改 :

1、把对压缩的或只读的数据库的修改写入到一个可写入文件中
这种修改被记录在该可写入文件的事务日志中
日后可把该事务日志文件内容传输出来实施对数据库的修改
当用户查询只读数据库文件时,能把存放在可写入文件中的修改一起得到。
2、利用实用程序dbwrite能建立一个可写入文件。


dbwrite:

语法: dbwrite [switches] database-file  [write-name ]

实例: dbwrite –c mydata.cdb mydata.wrt
-c — 为 mydata.cbd 建立一个可写入文件
可写入文件的名字是 mydata.wrt

Dbwrite(利用Sybase Central):

1. 打开 Utilities 文件夹
2. 在右半边双击 Create Write File
3. 点击 Next
4. 打算为其建立可写入文件的数据库进行连接
5. 打入要为其建立一个可写入文件的数据库名字以及存放可写入文件的位置。
6. 点击 Next
7. 必要的话,可选择一个日志文件。
8. 点击 Next
9. 必要的话,可打入一个镜象可写入文件。
10. 点击 Finish 则建立可写入文件


把修改施加于已压缩数据库 :

要想把存储在该可写入文件的修改施加到已压缩数据库时,可采用以下办法:
1、先转换写入文件成为SQL语句
利用dbtran
利用Sybase Central的 转换日志实用程序
2、再利用 dbexpand展开该数据库文件
3、最后把可写入文件中转换出来的 SQL语句施加于展开后的数据库上。


小结 :

1、Adaptive Server Anywhere 提供了防止因系统故障或介质故障而引起数据丢失的机制。
2、为此,Adaptive Server Anywhere 支持事务日志,校验点日志和回滚日志。
3、如果一个事务无法被成功地完成,则可利用回滚日志来复原数据。

4、要想恢复系统故障,先运行一个磁盘校验实用程序然后重新启动数据库引擎。

5、为防止数据丢失,要有规律地备份数据库,把事务日志存储在份开的设备上,以及使用事务日志镜象。

6、对数据库实施完全备份这是最简单的策略,但它仅适用于小型数据库。对大的数据库适于采用增量备份策略。

7、利用实用程序 dbbackup, 可对数据库文件,事务日志和可写入文件实现完全的或增量的以及联机的备份。

8、可以利用数据库压缩实用程序对主数据库文件进行压缩,压缩了的数据库文件是只读文件。可以利用可写入文件 (WRT) 实施对已压缩数据库的修改。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表