1、Sybase IQ server有三种备份类型:
(1)、完全备份(full)
(2)、增量备份(incremental)
(3)、完全备份的基础上增量备份(incremental
since full)
注:增量备份和完全备份的基础上增量备份都会对Catalog
Store 进行完全备份,默认情况下为完全
备份。
2、Sybase IQ server的顺序:
(1)、Catalog Store
(2)、Transaction log File
(3)、IQ Store
3、当IQ server正在备份时:
(1)、默认情况下操作员必须在现场,挂持接备份介质。
(2)、操作员可
以不在场,但必须正确地估算出备份的数据量大小,并且在安装备份设备时,要选“高级”安装方可。
(3)、数据库备
份不会将未提交的内容进行备份。
4、备份命令:
BACKUP DATABASE [CRC ON|OFF]
[Attended ON|OFF]
[BLOCK FACTOR integer]
[{FULL|INCREMENTAL|INCREMENTAL
SINCE FULL}]
TO
‘archive_device’ [SIZE # of KB integer]
例子:
BACKUP DATABASE TO ‘dev/rmt/0n’
注:BACKUP不支持裸设备
5、系统级别的备份:
如果IQ server运行时进行
系统级别的备份,则会导致服务崩溃或丢失数据。所以,必须确定IQ server是停止状态
时,方可进行系统级别备份。
6、备份的恢复:
(1)、必须连接到utility_db数据库后才可以进行恢复操作,并且在恢复数据时不能有用户连接到数据库,启动utility_db的方法:start_asiq -n myserver -gu utility_db。
(2)、如果有完全恢复,Catalog Store 和Transaction Log(即.db 和.log文件)必须从目标文件夹下删除。
(3)、如果为增量恢复,Catalog Store 和Transaction Log(即.db 和.log文件)必须存在于目标文件夹中。
(3)、恢复可以将原来dbspace的物理位置
更换,暨更改目录和名称。
7、恢复的命
令:
RESTORE
DATABASE ‘c:\\newdir\\mydb.db’
FROM ‘c:\\asiq\\backup1’
FROM ‘c:\\asiq\\backup2’
在进行恢复
时,必须注意恢复的顺序和备份时的顺序完全一致。
8、数据库备份后,配置文件和日志文件是没有被备份的,所以如果恢复时要单独对这两种文件进行恢复。配置文
件可以直接拷贝即可,但日志文件是不能用原来的.log文件的。
如果恢复到原来的目录中,则不用新建.log文件。如果没有恢复到原目录,则必须用dblog工具手动生
成.log文件。
9、dblog工具的命令语法:
Dblog [option] database_file
Option:
-t log-name,指定事务log文件名。
-m mirror-name,设置事务日
志镜象名。
-r,停止事务
日志的镜象。
-o,输出日志
信息到文件。
-q,安静模
式,不打印信息。
例:dblog -r -t f:\asiqmrr\asiqmrr.log f:\asiqmrr\asiqmrr.db
sybaseiq的备份与恢复:
备份:
backup database to
'e:\lslwork\temp\sybiqGP' ;
恢复:
restore database 'C:\Program
Files\Sybase\ASIQ-12_6\gupiao\GP.db'
from 'e:\lslwork\temp\sybiqGP'
关键字: commons-dbutils 工具包的使用
commons-dbutils 是 Apache 组织提供的一个开源 JDBC 工具类库,能让我们更简单的使用 JDBC 。
今天,在传智播客的课堂上,我们学习了 DBUtils 类库,知道了如何能够更方便地使用 JDBC 。以下是我的学习总结。
--------------------------------------------------------------------------------
1. API 介绍:
<1> org.apache.commons.dbutils.DbUtils:提供如关闭连接、装载 JDBC 驱动程序等常规工作的工具类;
<2> org.apache.commons.dbutils.QueryRunner:该类简单化了 SQL 查询,它与 ResultSetHandler 组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
<3> org.apache.commons.dbutils.ResultSetHandler:该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。
--------------------------------------------------------------------------------
2. 工具类的方法及示例代码:
<1> DBUtil 类的主要方法如下:
a. public static void close(…) throws java.sql.SQLException: DbUtils类提供了三个重载的关闭
方法。这些方法检查所提供的参数是不是 NULL ,如果不是的话,它们就关闭 Connection、Statement 和 ResultSet。
b. public static void closeQuietly(…): 这一类方法不仅能在 Connection、Statement 和ResultSet 为 NULL 情况下避免关闭,还能隐藏一些在程序中抛出的 SQLEeception。
c. public static void commitAndCloseQuietly(Connection conn): 用来提交连接,然后关闭连接,并
且在关闭连接时不抛出 SQL 异常。
d. public static boolean loadDriver(java.lang.String driverClassName):这一方装载并注册 JDBC 驱动程序,如果成功就返回 true 。使用该方法,你不需要捕捉这个异常 ClassNotFoundException。
--------------------------------------------------------------------------------
<2> QueryRunner 类的构造方法及主要方法:
a. 默认的构造方法:
public QueryRunner(){}
b. 需要一个 javax.sql.DataSource 来作参数的构造方法:
public QueryRunner(DataSource ds) {
this.ds = ds;
}
QueryRunner类的主要方法:
c. public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh)
throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。更重要的是参数 ResultSetHandler 会把从 ResultSet 中获得的数据转换成程序需要的数据格式。
d. public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException:几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得 Connection。
e. public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException :执行一个不需要置换参数的查询操作。
f. public int update(Connection conn, String sql, Object[] params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。
g. public int update(Connection conn, String sql) throws SQLException:用来执行一个不需要置换
参数的更新操作。
--------------------------------------------------------------------------------
<3> ResultSetHandler接口
ResultSetHandler 接口提供了一个单独的方法:
Object handle (java.sql.ResultSet .rs)。
--------------------------------------------------------------------------------
<4> ResultSetHandler 接口的实现类
a. ArrayHandler:把结果集中的第一行数据转成对象数组。
b. ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到 List 中。
c. BeanHandler:将结果集中的第一行数据封装到一个对应的 JavaBean 实例中。
d. BeanListHandler:将结果集中的每一行数据都封装到一个对应的 JavaBean 实例中,存放到 List里。
e. ColumnListHandler:将结果集中某一列的数据存放到 List 中。
f. KeyedHandler:将结果集中的每一行数据都封装到一个 Map 里,然后再根据指定的key把每个 Map 再存放到一个 Map 里。
g. MapHandler:将结果集中的第一行数据封装到一个 Map 里,key 是列名,value 就是对应的值。
h. MapListHandler:将结果集中的每一行数据都封装到一个 Map 里,然后再存放到 List。
i. ScalarHandler:将结果集中某一条记录的其中某一列的数据存成 Object。
--------------------------------------------------------------------------------
<5> 下面是简单对这几个工具类的测试代码:
QueryRunner runner = null;
runner = new QueryRunner();// 获得QueryRunner类的实例对象
Connection conn = null;
Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动
conn = DriverManager.getConnection("jdbc:mysql://localhost:3309/bookstore",
"root", "1230");// 与数据库建立连接
String sql = "SELECT id, name, title, price, yr, description, saleAmount FROM books
WHERE id = ?";// 准备 sql 语句
List<Book> list = (List) runner.query(conn, sql, new Object[]{"201"}, new
BeanListHandler(Book.class));// 运用 QueryRunner 的方法执行 sql 语句,并获取结果集,从这里可
//以看出运用 commons-dbutils 类库的方便之处,避免了创建 ResultSet 对象来设置参数的麻烦。
System.out.println(books.size()); //输出 books 的元素个数
--------------------------------------------------------------------------------
<6> 其它类和接口:
a. org.apache.commons.dbutils.QueryLoader类:属性文件加载器,主要用于加载属性文件中的 SQL 到内存中。
b. org.apache.commons.dbutils.wrappers.SqlNullCheckedResultSet类:该类是用来对sql语句执行完成
之后的的数值进行null的替换。
c. org.apache.commons.dbutils.wrappers.StringTrimmedResultSet类:去除ResultSet中字段的左右空格。
d. org.apache.commons.dbutils.RowProcessor接口:提供了把结果集的行数据转换成其它格式的功能。它的实现类是org.apache.commons.dbutils.BasicRowProcessor类。
Red Hat Linux默然会启动邮件通知服务,将系统的各种错误和告警日志信息发邮件通知Root用户,随着时间的积累,邮件数量不断膨胀,导致/根目录的磁盘空间已满,影响系统的正常运行,一般程序部署完毕后都禁止该邮件通知服务,具体的方法如下:
1)在控制台输入命令:Service sendmail stop,该命令是停止当前的邮件通知服务,但系统重启后该服务仍然默然启动;
2)在控制台输入命令:chkconfig --del sendmai,该命令是删除开机启动服务检查项,即开机不运行邮件通知服务;
3)mv /etc/rc.d/init.d/sendmail /etc/rc.d/init.d/sendmail.bak,把sendmail文件重命名;
Observer模式也称为观察者模式,
观察者模式是java已经实现的模式,我们只要利用java.util.Obserable类和java.util.Observer接口就可以实现观察者模式
实现过程:
被观察者必须继承Observable,一旦事件被触发,调用notifyObservers通知观察者
观察者必须实现Observer接口,实现update方法,完成事件处理
举个经典的例子....猫叫,老鼠跑.人惊醒....
代码:
1package javamodel.observer;
2
3import java.util.Observable;
4import java.util.Observer;
5
6/** *//**
7* 猫叫,老鼠跑,主人被惊醒,用代码实现这个连锁反应 。
8* @author Administrator
9*
10*/
11
12public class TestObserver {
13
14public static void main(String[] args){
15 Cat c=new Cat();
16 Observer o1=new Mouse();
17 Observer o2=new Man();
18 c.addObserver(o1);
19 Mouse oo1=(Mouse)o1;//向下转型
20 oo1.addObserver(o2);
21 c.CatSay();
22}
23
24}
25
26class Cat extends Observable{//猫被老鼠观察,猫是被观察者
27
28public void CatSay(){
29 System.out.println("猫叫了");
30 this.setChanged();
31 this.notifyObservers();
32}
33}
34
35class Mouse extends Observable implements Observer{//老鼠观察猫,猫是观察者,对于人,老鼠是被观察者
36
37public void update(Observable arg0, Object arg1) {
38 // TODO Auto-generated method stub
39 System.out.println("猫叫了,老鼠跑了");
40 this.setChanged();
41 this.notifyObservers();
42}
43
44}
45
46class Man implements Observer{//人观察老鼠,人是观察者
47
48public void update(Observable arg0, Object arg1) {
49 // TODO Auto-generated method stub
50 System.out.println("老鼠跑了,人惊醒了");
51}
52}
53
54
总结, 观察者模式的应用场景:
1、 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
2、 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
观察者模式的优点:
1、 Subject和Observer之间是松偶合的,分别可以各自独立改变。
2、 Subject在发送广播通知的时候,无须指定具体的Observer,Observer可以自己决定是否要订阅Subject的通知。
3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。
观察者模式的缺陷:
1、 松偶合导致代码关系不明显,有时可能难以理解。(废话)
2、 如果一个Subject被大量Observer订阅的话,在广播通知的时候可能会有效率问题。(毕竟只是简单的遍历)