資料庫inrecovery
Ⅰ C#備份及恢復資料庫
1. 在用戶的配置時,我們需要列出當前區域網內所有的資料庫伺服器,並且要列出指定伺服器的所有資料庫,實現代碼如下:
取得資料庫伺服器列表:
public ArrayList GetServerList()
{
ArrayList alServers = new ArrayList() ;
sqlDMO.Application sqlApp = new SQLDMO.ApplicationClass() ;
try
{
SQLDMO.NameList serverList = sqlApp.ListAvailableSQLServers() ;
for(int i = 1;i<= serverList.Count;i++)
{
alServers.Add(serverList.Item(i)) ;
}
}
catch(Exception e)
{
throw(new Exception("取資料庫伺服器列表出錯:"+e.Message)) ;
}
finally
{
sqlApp.Quit() ;
}
return alServers ;
}
取得指定資料庫伺服器的資料庫列表
public ArrayList GetDbList(string strServerName,string strUserName,string strPwd)
{
ServerName = strServerName ;
UserName = strUserName ;
Password = strPwd ;
ArrayList alDbs = new ArrayList() ;
SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass() ;
SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ;
try
{
svr.Connect(ServerName,UserName,Password) ;
foreach(SQLDMO.Database db in svr.Databases)
{
if(db.Name!=null)
alDbs.Add(db.Name) ;
}
}
catch(Exception e)
{
throw(new Exception("連接資料庫出錯:"+e.Message)) ;
}
finally
{
svr.DisConnect() ;
sqlApp.Quit() ;
}
return alDbs ;
}
2. 資料庫的備份和實時進度顯示代碼:
public bool BackUPDB(string strDbName,string strFileName, ProgressBar pgbMain)
{
PBar = pgbMain ;
SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ;
try
{
svr.Connect(ServerName,UserName,Password) ;
SQLDMO.Backup bak = new SQLDMO.BackupClass();
bak.Action = 0 ;
bak.Initialize = true ;
SQLDMO.BackupSink_PercentCompleteEventHandler pceh = new SQLDMO.BackupSink_PercentCompleteEventHandler(Step);
bak.PercentComplete += pceh;
bak.Files = strFileName;
bak.Database = strDbName;
bak.SQLBackup(svr);
return true ;
}
catch(Exception err)
{
throw(new Exception("備份資料庫失敗"+err.Message)) ;
}
finally
{
svr.DisConnect() ;
}
}
private void Step(string message,int percent)
{
PBar.Value = percent ;
}
其中,這兩個語句實現了進度的實時顯示:
SQLDMO.BackupSink_PercentCompleteEventHandler pceh = new SQLDMO.BackupSink_PercentCompleteEventHandler(Step);
bak.PercentComplete += pceh;
Step就是上面private void Step(string message,int percent) 的方法名稱,它用來顯示進度條的當前進度。
3. 資料庫的恢復和殺死進程的代碼:
public bool RestoreDB(string strDbName,string strFileName, ProgressBar pgbMain)
{
PBar = pgbMain ;
SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ;
try
{
svr.Connect(ServerName,UserName,Password) ;
SQLDMO.QueryResults qr = svr.EnumProcesses(-1) ;
int iColPIDNum = -1 ;
int iColDbName = -1 ;
for(int i=1;i<=qr.Columns;i++)
{
string strName = qr.get_ColumnName(i) ;
if (strName.ToUpper().Trim() == "SPID")
{
iColPIDNum = i ;
}
else if (strName.ToUpper().Trim() == "DBNAME")
{
iColDbName = i ;
}
if (iColPIDNum != -1 && iColDbName != -1)
break ;
}
for(int i=1;i<=qr.Rows;i++)
{
int lPID = qr.GetColumnLong(i,iColPIDNum) ;
string strDBName = qr.GetColumnString(i,iColDbName) ;
if (strDBName.ToUpper() == strDbName.ToUpper())
svr.KillProcess(lPID) ;
}
SQLDMO.Restore res = new SQLDMO.RestoreClass() ;
res.Action = 0 ;
SQLDMO.RestoreSink_PercentCompleteEventHandler pceh = new SQLDMO.RestoreSink_PercentCompleteEventHandler(Step);
res.PercentComplete += pceh;
res.Files = strFileName ;
res.Database = strDbName ;
res.ReplaceDatabase = true ;
res.SQLRestore(svr) ;
return true ;
}
catch(Exception err)
{
throw(new Exception("恢復資料庫失敗,請關閉所有和該資料庫連接的程序!"+err.Message)) ;
}
finally
{
svr.DisConnect() ;
}
}
其中這個語句取得了所有的進程列表:
SQLDMO.QueryResults qr = svr.EnumProcesses(-1) ;
下面的語句找到和要恢復資料庫相關的進程並殺死:
int iColPIDNum = -1 ;
int iColDbName = -1 ;
for(int i=1;i<=qr.Columns;i++)
{
string strName = qr.get_ColumnName(i) ;
if (strName.ToUpper().Trim() == "SPID")
{
iColPIDNum = i ;
}
else if (strName.ToUpper().Trim() == "DBNAME")
{
iColDbName = i ;
}
if (iColPIDNum != -1 && iColDbName != -1)
break ;
}
for(int i=1;i<=qr.Rows;i++)
{
int lPID = qr.GetColumnLong(i,iColPIDNum) ;
string strDBName = qr.GetColumnString(i,iColDbName) ;
if (strDBName.ToUpper() == strDbName.ToUpper())
svr.KillProcess(lPID) ;
}
Ⅱ mysql 如何備份和還原資料庫
目前 MySQL 支持的免費備份工具有:mysqlmp、mysqlhot,還可以用 SQL 語法進行備份:BACKUP TABLE 或者 SELECT INTO OUTFILE,又或者備份二進制日誌(binlog),還可以是直接拷貝數據文件和相關的配置文件。MyISAM 表是保存成文件的形式,因此相對比較容易備份,上面提到的幾種方法都可以使用。Innodb 所有的表都保存在同一個數據文件 ibdata1 中(也可能是多個文件,或者是獨立的表空間文件),相對來說比較不好備份,免費的方案可以是拷貝數據文件、備份 binlog,或者用 mysqlmp。
1、mysqlmp
1.1 備份
mysqlmp 是採用SQL級別的備份機制,它將數據表導成 SQL 腳本文件,在不同的 MySQL 版本之間升級時相對比較合適,這也是最常用的備份方法。現在來講一下 mysqlmp 的一些主要參數:
•--compatible=name
它告訴 mysqlmp,導出的數據將和哪種資料庫或哪個舊版本的 MySQL 伺服器相兼容。值可以為 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options 等,要使用幾個值,用逗號將它們隔開。當然了,它並不保證能完全兼容,而是盡量兼容。
•--complete-insert,-c
導出的數據採用包含欄位名的完整 INSERT 方式,也就是把所有的值都寫在一行。這么做能提高插入效率,但是可能會受到 max_allowed_packet 參數的影響而導致插入失敗。因此,需要謹慎使用該參數,至少我不推薦。
•--default-character-set=charset
指定導出數據時採用何種字元集,如果數據表不是採用默認的 latin1 字元集的話,那麼導出時必須指定該選項,否則再次導入數據後將產生亂碼問題。
•--disable-keys
告訴 mysqlmp 在 INSERT 語句的開頭和結尾增加 /*!40000 ALTER TABLE table DISABLE KEYS */; 和 /*!40000 ALTER TABLE table ENABLE KEYS */; 語句,這能大大提高插入語句的速度,因為它是在插入完所有數據後才重建索引的。該選項只適合 MyISAM 表。
•--extended-insert = true|false
默認情況下,mysqlmp 開啟 --complete-insert 模式,因此不想用它的的話,就使用本選項,設定它的值為 false 即可。
•--hex-blob
使用十六進制格式導出二進制字元串欄位。如果有二進制數據就必須使用本選項。影響到的欄位類型有 BINARY、VARBINARY、BLOB。
•--lock-all-tables,-x
在開始導出之前,提交請求鎖定所有資料庫中的所有表,以保證數據的一致性。這是一個全局讀鎖,並且自動關閉 --single-transaction 和 --lock-tables 選項。
•--lock-tables
它和 --lock-all-tables 類似,不過是鎖定當前導出的數據表,而不是一下子鎖定全部庫下的表。本選項只適用於 MyISAM 表,如果是 Innodb 表可以用 --single-transaction 選項。
•--no-create-info,-t
只導出數據,而不添加 CREATE TABLE 語句。
•--no-data,-d
不導出任何數據,只導出資料庫表結構。
•--opt
這只是一個快捷選項,等同於同時添加 --add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 選項。本選項能讓 mysqlmp 很快的導出數據,並且導出的數據能很快導回。該選項默認開啟,但可以用 --skip-opt 禁用。注意,如果運行 mysqlmp 沒有指定 --quick 或 --opt 選項,則會將整個結果集放在內存中。如果導出大資料庫的話可能會出現問題。
•--quick,-q
該選項在導出大表時很有用,它強制 mysqlmp 從伺服器查詢取得記錄直接輸出而不是取得所有記錄後將它們緩存到內存中。
•--routines,-R
導出存儲過程以及自定義函數。
•--single-transaction
該選項在導出數據之前提交一個 BEGIN SQL語句,BEGIN 不會阻塞任何應用程序且能保證導出時資料庫的一致性狀態。它只適用於事務表,例如 InnoDB 和 BDB。本選項和 --lock-tables 選項是互斥的,因為 LOCK TABLES 會使任何掛起的事務隱含提交。要想導出大表的話,應結合使用 --quick 選項。
•--triggers
同時導出觸發器。該選項默認啟用,用 --skip-triggers 禁用它。
其他參數詳情請參考手冊,我通常使用以下 SQL 來備份 MyISAM 表:
/usr/local/mysql/bin/mysqlmp -uyejr -pyejr --default-character-set=utf8 --opt --extended-insert=false \
--triggers -R --hex-blob -x db_name > db_name.sql
使用以下 SQL 來備份 Innodb 表:
/usr/local/mysql/bin/mysqlmp -uyejr -pyejr --default-character-set=utf8 --opt --extended-insert=false \
--triggers -R --hex-blob --single-transaction db_name > db_name.sql
1.2 還原
用 mysqlmp 備份出來的文件是一個可以直接倒入的 SQL 腳本,有兩種方法可以將數據導入。
•直接用 mysql 客戶端
例如:
/usr/local/mysql/bin/mysql -uyejr -pyejr db_name < db_name.sql
•用 SOURCE 語法
其實這不是標準的 SQL 語法,而是 mysql 客戶端提供的功能,例如:
SOURCE /tmp/db_name.sql;
這里需要指定文件的絕對路徑,並且必須是 mysqld 運行用戶(例如 nobody)有許可權讀取的文件。
2、 mysqlhot
2.1 備份
mysqlhot 是一個 PERL 程序,最初由Tim Bunce編寫。它使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp 來快速備份資料庫。它是備份資料庫或單個表的最快的途徑,但它只能運行在資料庫文件(包括數據表定義文件、數據文件、索引文件)所在的機器上。mysqlhot 只能用於備份 MyISAM,並且只能運行在 類Unix 和 NetWare 系統上。
mysqlhot 支持一次性拷貝多個資料庫,同時還支持正則表達。以下是幾個例子:
root#/usr/local/mysql/bin/mysqlhot -h=localhost -u=yejr -p=yejr db_name /tmp (把資料庫目錄 db_name 拷貝到 /tmp 下)
root#/usr/local/mysql/bin/mysqlhot -h=localhost -u=yejr -p=yejr db_name_1 ... db_name_n /tmp
root#/usr/local/mysql/bin/mysqlhot -h=localhost -u=yejr -p=yejr db_name./regex/ /tmp
更詳細的使用方法請查看手冊,或者調用下面的命令來查看 mysqlhot 的幫助:
perldoc /usr/local/mysql/bin/mysqlhot
注意,想要使用 mysqlhot,必須要有 SELECT、RELOAD(要執行 FLUSH TABLES) 許可權,並且還必須要能夠有讀取 datadir/db_name 目錄的許可權。
2.2 還原
mysqlhot 備份出來的是整個資料庫目錄,使用時可以直接拷貝到 mysqld 指定的 datadir (在這里是 /usr/local/mysql/data/)目錄下即可,同時要注意許可權的問題,如下例:
root#cp -rf db_name /usr/local/mysql/data/
root#chown -R nobody:nobody /usr/local/mysql/data/ (將 db_name 目錄的屬主改成 mysqld 運行用戶)
3、 SQL 語法備份
3.1 備份
BACKUP TABLE 語法其實和 mysqlhot 的工作原理差不多,都是鎖表,然後拷貝數據文件。它能實現在線備份,但是效果不理想,因此不推薦使用。它只拷貝表結構文件和數據文件,不同時拷貝索引文件,因此恢復時比較慢。例子:
BACK TABLE tbl_name TO '/tmp/db_name/';
注意,必須要有 FILE 許可權才能執行本SQL,並且目錄 /tmp/db_name/ 必須能被 mysqld 用戶可寫,導出的文件不能覆蓋已經存在的文件,以避免安全問題。
SELECT INTO OUTFILE 則是把數據導出來成為普通的文本文件,可以自定義欄位間隔的方式,方便處理這些數據。例子:
SELECT INTO OUTFILE '/tmp/db_name/tbl_name.txt' FROM tbl_name;
注意,必須要有 FILE 許可權才能執行本SQL,並且文件 /tmp/db_name/tbl_name.txt 必須能被 mysqld 用戶可寫,導出的文件不能覆蓋已經存在的文件,以避免安全問題。
3.2 恢復
用 BACKUP TABLE 方法備份出來的文件,可以運行 RESTORE TABLE 語句來恢復數據表。例子:
RESTORE TABLE FROM '/tmp/db_name/';
許可權要求類似上面所述。
用 SELECT INTO OUTFILE 方法備份出來的文件,可以運行 LOAD DATA INFILE 語句來恢復數據表。例子:
LOAD DATA INFILE '/tmp/db_name/tbl_name.txt' INTO TABLE tbl_name;
許可權要求類似上面所述。倒入數據之前,數據表要已經存在才行。如果擔心數據會發生重復,可以增加 REPLACE 關鍵字來替換已有記錄或者用 IGNORE 關鍵字來忽略他們。
補充:
shell> mysqlmp --quick db_name | gzip > db_name.contents.gz(該例子中創建的文件是壓縮格式)。
恢復/轉移到另一台的命令如下:
shell> gunzip < db_name.contents.gz | mysql db_name以上命令,適用於*nix 操作系統的機器
4、 啟用二進制日誌(binlog)
採用 binlog 的方法相對來說更靈活,省心省力,而且還可以支持增量備份。
啟用 binlog 時必須要重啟 mysqld。首先,關閉 mysqld,打開 my.cnf,加入以下幾行:
server-id = 1
log-bin = binlog
log-bin-index = binlog.index
然後啟動 mysqld 就可以了。運行過程中會產生 binlog.000001 以及 binlog.index,前面的文件是 mysqld 記錄所有對數據的更新操作,後面的文件則是所有 binlog 的索引,都不能輕易刪除。關於 binlog 的信息請查看手冊。
需要備份時,可以先執行一下 SQL 語句,讓 mysqld 終止對當前 binlog 的寫入,就可以把文件直接備份,這樣的話就能達到增量備份的目的了:
FLUSH LOGS;如果是備份復制系統中的從伺服器,還應該備份 master.info 和 relay-log.info 文件。
備份出來的 binlog 文件可以用 MySQL 提供的工具 mysqlbinlog 來查看,如:
/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001
該工具允許你顯示指定的資料庫下的所有 SQL 語句,並且還可以限定時間范圍,相當的方便,詳細的請查看手冊。
恢復時,可以採用類似以下語句來做到:
/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001 | mysql -uyejr -pyejr db_name
把 mysqlbinlog 輸出的 SQL 語句直接作為輸入來執行它。
如果你有空閑的機器,不妨採用這種方式來備份。由於作為 slave 的機器性能要求相對不是那麼高,因此成本低,用低成本就能實現增量備份而且還能分擔一部分數據查詢壓力,何樂而不為呢?
5、 直接備份數據文件
相較前幾種方法,備份數據文件最為直接、快速、方便,缺點是基本上不能實現增量備份。為了保證數據的一致性,需要在靠背文件前,執行以下 SQL 語句:
FLUSH TABLES WITH READ LOCK;也就是把內存中的數據都刷新到磁碟中,同時鎖定數據表,以保證拷貝過程中不會有新的數據寫入。這種方法備份出來的數據恢復也很簡單,直接拷貝回原來的資料庫目錄下即可。
注意,對於 Innodb 類型表來說,還需要備份其日誌文件,即 ib_logfile* 文件。因為當 Innodb 表損壞時,就可以依靠這些日誌文件來恢復。
6、 備份策略
對於中等級別業務量的系統來說,備份策略可以這么定:第一次全量備份,每天一次增量備份,每周再做一次全量備份,如此一直重復。而對於重要的且繁忙的系統來說,則可能需要每天一次全量備份,每小時一次增量備份,甚至更頻繁。為了不影響線上業務,實現在線備份,並且能增量備份,最好的辦法就是採用主從復制機制(replication),在 slave 機器上做備份。
7、 數據維護和災難恢復
作為一名DBA(我目前還不是,呵呵),最重要的工作內容之一是保證數據表能安全、穩定、高速使用。因此,需要定期維護你的數據表。以下 SQL 語句就很有用:
CHECK TABLE 或 REPAIR TABLE,檢查或維護 MyISAM 表
OPTIMIZE TABLE,優化 MyISAM 表
ANALYZE TABLE,分析 MyISAM 表
當然了,上面這些命令起始都可以通過工具 myisamchk 來完成,在這里不作詳述。
Innodb 表則可以通過執行以下語句來整理碎片,提高索引速度:
ALTER TABLE tbl_name ENGINE = Innodb;
這其實是一個 NULL 操作,表面上看什麼也不做,實際上重新整理碎片了。
通常使用的 MyISAM 表可以用上面提到的恢復方法來完成。如果是索引壞了,可以用 myisamchk 工具來重建索引。而對於 Innodb 表來說,就沒這么直接了,因為它把所有的表都保存在一個表空間了。不過 Innodb 有一個檢查機制叫 模糊檢查點,只要保存了日誌文件,就能根據日誌文件來修復錯誤。可以在 my.cnf 文件中,增加以下參數,讓 mysqld 在啟動時自動檢查日誌文件:
innodb_force_recovery = 4
關於該參數的信息請查看手冊。
有點長 慢慢看 對你應該有幫助
Ⅲ 系統崩潰後,關於MYSQL恢復資料庫的問題!求救啊!
MySQL 在崩潰恢復時,會遍歷打開所有 ibd 文件的 header page 驗證數據字典的准確性,如果 MySQL 中包含了大量表,這個校驗過程就會比較耗時。 MySQL 下崩潰恢復確實和表數量有關,表總數越大,崩潰恢復時間越長。另外磁碟 IOPS 也會影響崩潰恢復時間,像這里開發庫的 HDD IOPS 較低,因此面對大量的表空間,校驗速度就非常緩慢。另外一個發現,MySQL 8 下正常啟用時居然也會進行表空間校驗,而故障恢復時則會額外再進行一次表空間校驗,等於校驗了 2 遍。不過 MySQL 8.0 里多了一個特性,即表數量超過 5W 時,會啟用多線程掃描,加快表空間校驗過程。
如何跳過校驗MySQL 5.7 下有方法可以跳過崩潰恢復時的表空間校驗過程嘛?查閱了資料,方法主要有兩種:
1. 配置 innodb_force_recovery可以使 srv_force_recovery != 0 ,那麼 validate = false,即可以跳過表空間校驗。實際測試的時候設置 innodb_force_recovery =1,也就是強制恢復跳過壞頁,就可以跳過校驗,然後重啟就是正常啟動了。通過這種臨時方式可以避免崩潰恢復後非常耗時的表空間校驗過程,快速啟動 MySQL,個人目前暫時未發現有什麼隱患。2. 使用共享表空間替代獨立表空間這樣就不需要打開 N 個 ibd 文件了,只需要打開一個 ibdata 文件即可,大大節省了校驗時間。自從聽了姜老師講過使用共享表空間替代獨立表空間解決 drop 大表時性能抖動的原理後,感覺共享表空間在很多業務環境下,反而更有優勢。
臨時冒出另外一種解決想法,即用 GDB 調試崩潰恢復,通過臨時修改 validate 變數值讓 MySQL 跳過表空間驗證過程,然後讓 MySQL 正常關閉,重新啟動就可以正常啟動了。但是實際測試發現,如果以 debug 模式運行,確實可以臨時修改 validate 變數,跳過表空間驗證過程,但是 debug 模式下代碼運行效率大打折扣,反而耗時更長。而以非 debug 模式運行,則無法修改 validate 變數,想法破滅。
Ⅳ MS SQL 資料庫的狀態是In recovery,之前做過鏡像; 但是 ALTER DATABASE db_name SET PARTNER OFF失敗
這是典型的許可權不足所致。
RESTORE cannot operate on database 'WILSON'
你要修改許可權,繼續操作。
Ⅳ 如何解決Database處於Recovery Pending狀態
嘗試一
=======================
運行下面的命令, 失敗.
RESTORE DATABASE SharePoint_Config WITH RECOVERY
報錯:
Msg 3148, Level 16, State 3, Line 1
This RESTORE statement is invalid in the current context. The 'Recover Data Only' option is only defined for secondary filegroups when the database is in an online state. When the database is in an offline state filegroups cannot be specified.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.
嘗試二
======================
運行下面的命令, 失敗.
DBCC checkdb ('SharePoint_Config')
報錯:
Msg 945, Level 14, State 2, Line 1
Database 'SharePoint_Config' cannot be opened e to inaccessible files or insufficient memory or disk space. See the SQL Server errorlog for details.
這里注意到"inaccessible files"字樣, 於是想起應該檢查一下存放MDF和LDF的路徑的許可權設置是否與默認的文件夾相同.
經過比較, 發現少了用戶"MSSQLSERVER"的full control.
添加NT Service\MSSQLSERVER用戶後, 賦予full control許可權, 問題依舊. 看起來不是許可權的問題.
筆者還嘗試了下面的命令, 均告失敗.
EXEC sp_resetstatus 'SharePoint_Config';
ALTER DATABASE "SharePoint_Config" SET EMERGENCY
DBCC checkdb('SharePoint_Config')
ALTER DATABASE "SharePoint_Config" SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DBCC CheckDB ('SharePoint_Config', REPAIR_FAST)
DBCC CheckDB ('SharePoint_Config', REPAIR_ALLOW_DATA_LOSS)
筆者最後將兩個資料庫刪掉, 重新Attach MDF和LDF文件, 才將資料庫狀態恢復.
參考資料
=======================
Database States
http://msdn.microsoft.com/en-us/library/ms190442.aspx
DBCC CHECKDB
http://msdn.microsoft.com/en-us/library/aa258278%28v=sql.80%29.aspx
Suspect Database Recovery (SQL Server 2005)
http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/ea8b251f-fbce-4f8b-8a87-1b570688ce88/
Ⅵ recovery mode是什麼意思
recovery mode恢復模式。
例句:
1、.
我的資料庫工作在簡單的恢復模式。
2、DatabaseinRecoveryMode.Cannotbemoved/copied.
資料庫處於恢復模式。無法將其移動/復制。
英語翻譯技巧:
第一、省略翻譯法
這與最開始提到的增譯法相反,就是要求你把不符合漢語,或者英語的表達的方式、思維的習慣或者語言的習慣的部分刪去,以免使所翻譯出的句子沉雜累贅。
第二、合並法
合並翻譯法就是把多個短句子或者簡單句合並到一起,形成一個復合句或者說復雜句,多出現在漢譯英的題目里出現,比如最後會翻譯成定語從句、狀語從句、賓語從句等等。
Ⅶ 該選擇哪個開源資料庫
如果打算為項目選擇一款免費、開源的資料庫,那麼你可能會在MySQL與PostgreSQL之間猶豫不定。MySQL與PostgreSQL都是免費、開源、強大、且功能豐富的資料庫。你主要的問題可能是:哪一個才是最好的開源資料庫,MySQL還是PostgreSQL呢?該選擇哪一個開源資料庫呢?
在選擇資料庫時,你所做的是個長期的決策,因為後面如果再改變決定將是非常困難且代價高昂的。你希望一開始就選擇正確。兩個流行的開源資料庫MySQL與PostgreSQL常常成為最後要選擇的產品。對這兩個開源資料庫的高層次概覽將會有助於你選擇最適合自己需要的。
MySQL
MySQL相對來說比較年輕,首度出現在1994年。它聲稱自己是最流行的開源資料庫。MySQL就是LAMP(用於Web開發的軟體包,包括Linux、Apache及Perl/php/Python)中的M。構建在LAMP棧之上的大多數應用都會使用MySQL,包括那些知名的應用,如WordPress、Drupal、Zend及phpBB等。
一開始,MySQL的設計目標是成為一個快速的Web伺服器後端,使用快速的索引序列訪問方法(ISAM),不支持ACID。經過早期快速的發展之後,MySQL開始支持更多的存儲引擎,並通過InnoDB引擎實現了ACID。MySQL還支持其他存儲引擎,提供了臨時表的功能(使用MEMORY存儲引擎),通過MyISAM引擎實現了高速讀的資料庫,此外還有其他的核心存儲引擎與第三方引擎。
MySQL的文檔非常豐富,有很多質量不錯的免費參考手冊、圖書與在線文檔,還有來自於Oracle和第三方廠商的培訓與支持。
MySQL近幾年經歷了所有權的變更和一些頗具戲劇性的事件。它最初是由MySQL
AB開發的,然後在2008年以10億美金的價格賣給了Sun公司,Sun公司又在2010年被Oracle收購。Oracle支持MySQL的多個版本:Standard、Enterprise、Classic、Cluster、Embedded與Community。其中有一些是免費下載的,另外一些則是收費的。其核心代碼基於GPL許可,對於那些不想使用GPL許可的開發者與廠商來說還有商業許可可供使用。
現在,基於最初的MySQL代碼還有更多的資料庫可供選擇,因為幾個核心的MySQL開發者已經發布了MySQL分支。最初的MySQL創建者之一Michael
"Monty"
Widenius貌似後悔將MySQL賣給了Sun公司,於是又開發了他自己的MySQL分支MariaDB,它是免費的,基於GPL許可。知名的MySQL開發者Brian
Aker所創建的分支Drizzle對其進行了大量的改寫,特別針對多CPU、雲、網路應用與高並發進行了優化。
PostgreSQL
PostgreSQL標榜自己是世界上最先進的開源資料庫。PostgreSQL的一些粉絲說它能與Oracle相媲美,而且沒有那麼昂貴的價格和傲慢的客服。它擁有很長的歷史,最初是1985年在加利福尼亞大學伯克利分校開發的,作為Ingres資料庫的後繼。
PostgreSQL是完全由社區驅動的開源項目,由全世界超過1000名貢獻者所維護。它提供了單個完整功能的版本,而不像MySQL那樣提供了多個不同的社區版、商業版與企業版。PostgreSQL基於自由的BSD/MIT許可,組織可以使用、復制、修改和重新分發代碼,只需要提供一個版權聲明即可。
可靠性是PostgreSQL的最高優先順序。它以堅如磐石的品質和良好的工程化而聞名,支持高事務、任務關鍵型應用。PostgreSQL的文檔非常精良,提供了大量免費的在線手冊,還針對舊版本提供了歸檔的參考手冊。PostgreSQL的社區支持是非常棒的,還有來自於獨立廠商的商業支持。
數據一致性與完整性也是PostgreSQL的高優先順序特性。PostgreSQL是完全支持ACID特性的,它對於資料庫訪問提供了強大的安全性保證,充分利用了企業安全工具,如Kerberos與OpenSSL等。你可以定義自己的檢查,根據自己的業務規則確保數據質量。在眾多的管理特性中,point-in-time
recovery(PITR)是非常棒的特性,這是個靈活的高可用特性,提供了諸如針對失敗恢復創建熱備份以及快照與恢復的能力。但這並不是PostgreSQL的全部,項目還提供了幾個方法來管理PostgreSQL以實現高可用、負載均衡與復制等,這樣你就可以使用適合自己特定需求的功能了。
平台
MySQL與PostgreSQL都出現在一些高流量的Web站點上:
- MySQL:Slashdot、Twitter、Facebook與Wikipedia
- PostgreSQL:Yahoo使用了一個修改的PostgreSQL資料庫來處理每天數以億計的事件,還有Reddit和Disqus
MySQL與PostgreSQL都能運行在多個操作系統上,如Linux、Unix、Mac OS
X與Windows。他們都是開源、免費的,因此測試他們時的唯一代價就是你的時間與硬體。他們都很靈活且具有可伸縮性,可用在小型系統和大型分布式系統上。MySQL在一個領域上要比PostgreSQL更進一步,那就是它的觸角延伸到了嵌入式領域,這是通過libmysqld實現的。PostgreSQL不支持嵌入式應用,依然堅守在傳統的客戶端/伺服器架構上。
MySQL通常被認為是針對網站與應用的快速資料庫後端,能夠進行快速的讀取和大量的查詢操作,不過在復雜特性與數據完整性檢查方面不太盡如人意。PostgreSQL是針對事務型企業應用的嚴肅、功能完善的資料庫,支持強ACID特性和很多數據完整性檢查。他們二者都在某些任務上具有很快的速度,MySQL不同存儲引擎的行為有較大差別。MyISAM引擎是最快的,因為它只執行很少的數據完整性檢查,適合於後端讀操作較多的站點,不過對於包含敏感數據的讀/寫資料庫來說就是個災難了,因為MyISAM表最終可能會損壞。MySQL提供了修復MySQL表的工具,不過對於敏感數據來說,支持ACID特性的InnoDB則是個更好的選擇。
與之相反,PostgreSQL則是個只有單一存儲引擎的完全集成的資料庫。你可以通過調整postgresql.conf文件的參數來改進性能,也可以調整查詢與事務。PostgreSQL文檔對於性能調優提供了非常詳盡的介紹。
MySQL與PostgreSQL都是高可配置的,並且可以針對不同的任務進行相應的優化。他們都支持通過擴展來添加額外的功能。
一個常見的誤解就是MySQL要比PostgreSQL更容易學習。關系資料庫系統都是非常復雜的,這兩個資料庫的學習曲線其實是差不多的。
標准兼容性
PostgreSQL旨在實現SQL兼容性(當前標準是ANSI-SQL:2008)。MySQL則兼容大部分SQL,不過還有自己的擴展,可以支持NoSQL特性,這在參考手冊中都有介紹。每種方式都有優缺點。兼容標准會讓資料庫管理員、資料庫開發者與應用開發者更舒服一些,因為這意味著他們只需學習一套標准、一套特性和命令即可。這會節省時間,提升效率,也不會被鎖定在特定的廠商上。
支持使用非標準的自定義功能的人們認為這樣可以快速採用新的特性,而不必等待標准進程完成。ANSI/ISO標准在不斷演化,因此標准兼容性也是個變化的目標:知名的關系型資料庫Microsoft
SQL Server、Oracle與IBM DB2也只是部分兼容於標准。
結論
雖然有不同的歷史、引擎與工具,不過並沒有明確的參考能夠表明這兩個資料庫哪一個能夠適用於所有情況。很多組織喜歡使用PostgreSQL,因為它的可靠性好,在保護數據方面很擅長,而且是個社區項目,不會陷入廠商的牢籠之中。MySQL更加靈活,提供了更多選項來針對不同的任務進行裁剪。很多時候,對於一個組織來說,對某個軟體使用的熟練程度要比特性上的原因更重要。
Ⅷ 求助資料庫恢復後無法open
你的分析是正確的。
你要用「Point-In-Time Recovery」來恢復到數據刪除前的時間點。
在啟動 RMAN 前,set 時間的 format:
alter session set NLS_DATE_FORMAT="MM-DD-YYYY HH24:MI:SS";
然後,用下面的指令:
RUN
{
SET UNTIL TIME 『04-25-2009 16:30:00』;
RESTORE DATABASE;
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
}
這個時間 『04-25-2009 16:30:00』 必須是你刪除數據前的時間。
或者,你也可用 SCN。或者用 log sequence。你可以從 alert.log 里,找到刪除數據前相應的 SCN 和 log sequence number。例如:
SET UNTIL SCN 58490;
SET UNTIL SEQUENCE 4823;
上面,我用的是 RMAN script。你也可以一條條的作為指令執行。
Ⅸ 如何完整備份ORACLE 10g資料庫並恢復到另一個機器上
Oracle10G資料庫中,資料庫文件的備份與恢復可以有很多的方式來實現,這里介紹一種基於用戶管理的備份與恢復。基於用戶管理的備份是指使用OS命令來備份資料庫物理文件。
備份資料庫
資料庫一致性備份:關閉資料庫以後備份資料庫物理文件,這時數據文件scn值完全一致,所以稱之為資料庫的一致性備份或冷備份,適用於歸檔模式與非歸檔模式。
對基於用戶管理的冷備份的暫時理解:在資料庫shutdown狀態下使用OS命令直接拷貝資料庫物理文件。
資料庫非一致性備份:在open狀態下備份資料庫物理文件,這時資料庫內容可能會改變導致數據文件scn不一致,所以稱之為資料庫的非一致性備份或熱備份,只適用於歸檔模式。
基於用戶管理的完全恢復(歸檔模式下)
1.在open狀態下備份資料庫物理文件(資料庫非一致性備份,熱備份,不影響業務運行)
2.刪除數據文件來模擬文件丟失(只是刪除了所有的數據文件;控制文件等其它文件處於正常狀態)
3.對數據文件進行恢復
4.應用歸檔日誌
5.查看數據是否完全恢復
--sysdba執行備份
SQL> conn / as sysdba
Connected.
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/oracle/10g/oracle/proct/10.2.0/oradata/oralife/system01.dbf
/oracle/10g/oracle/proct/10.2.0/oradata/oralife/undotbs01.dbf
/oracle/10g/oracle/proct/10.2.0/oradata/oralife/sysaux01.dbf
/oracle/10g/oracle/proct/10.2.0/oradata/oralife/users01.dbf
/oracle/10g/oracle/proct/10.2.0/oradata/oralife/example01.dbf
SQL> alter database begin backup;
Database altered.
SQL> host cp /oracle/10g/oracle/proct/10.2.0/oradata/oralife/*.dbf /oracle/10g/oracle/bakup/database/ --備份所有數據文件
SQL> alter database backup controlfile to '/oracle/10g/oracle/bakup/database/oralife.ctl'; --備份控制文件
Database altered.
SQL> alter system archive log current; --歸檔當前日誌組
System altered.
進行完全恢復
備份的數據文件到指定的目標位置,進行恢復:
SQL> recover database --open狀態
ORA-00283: recovery session canceled e to errors
ORA-01124: cannot recover data file 1 - file is in use or recovery
ORA-01110: data file 1:
'/oracle/10g/oracle/proct/10.2.0/oradata/oralife/system01.dbf'
SQL> shutdown immediate --open狀態
ORA-01122: database file 1 failed verification check
ORA-01110: data file 1: '/oracle/10g/oracle/proct/10.2.0/oradata/oralife/system01.dbf'
ORA-01208: data file is an old version - not accessing current version
SQL> startup force mount; --進入mount狀態進行恢復
ORACLE instance started.
Total System Global Area 528482304 bytes
Fixed Size 1220360 bytes
Variable Size 163578104 bytes
Database Buffers 356515840 bytes
Redo Buffers 7168000 bytes
Database mounted.
SQL> recover database
Media recovery complete.
SQL> alter database open;
Database altered.
沒有出現應用歸檔日誌,應用歸檔日誌有幾種方式:
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
當在open狀態下對數據文件進行恢復時,應該將其offline,恢復完成後,再將其online;所有的恢復應該盡量在open狀態下完成。