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方法,完成事件處理
舉個經典的例子....貓叫,老鼠跑.人驚醒....
代碼:
1
package javamodel.observer;
2
3
import java.util.Observable;
4
import java.util.Observer;
5
6
/** *//**
7
* 貓叫,老鼠跑,主人被驚醒,用代碼實現這個連鎖反應 。
8
* @author Administrator
9
*
10
*/
11
12
public class TestObserver
{
13
14
public 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
26
class Cat extends Observable
{//貓被老鼠觀察,貓是被觀察者
27
28
public void CatSay()
{
29
System.out.println("貓叫了");
30
this.setChanged();
31
this.notifyObservers();
32
}
33
}
34
35
class Mouse extends Observable implements Observer
{//老鼠觀察貓,貓是觀察者,對于人,老鼠是被觀察者
36
37
public 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
46
class Man implements Observer
{//人觀察老鼠,人是觀察者
47
48
public 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訂閱的話,在廣播通知的時候可能會有效率問題。(畢竟只是簡單的遍歷)