主庫千萬級的資料更新後,STANDBY日誌應用大量延遲的問題處理
因為業務需要,不得不在生產上更新一個千萬級的大表,更新過程中產生了4個G左右的日誌後發現此更新會導致其他問題,取消更新,然後更正更新的邏輯後,重新對這千萬級的資料進行更新,產生6個多G的日誌後,更新完成,但是卻造成了其他兩個邏輯STANDBY的大量延遲。如何加快這些日誌的應用,是一個比較嚴重的問題。
[@more@]1、首先是加快主庫的更新操作,那麼首先關閉主庫對STANDBY的歸檔,減少主庫寫STANDBY庫日誌對主庫產生的壓力,這需要在更新開始前在主庫設定log_archive_dest_state_N引數為DEFER,然後主庫切換日誌來啟用這個新的引數設定。注意:如果是RAC的主庫,則每個庫都需要設定此引數,並且每個庫都進行一次日誌切換操作。
2、主庫更新完成後,可以在備用庫做一些設定來加速日誌應用的更新,引數如下:
APPLY_SERVERS=16--可以設定更多的並行應用的進行來提高應用的速度
PREPARE_SERVERS=8--可以設定更多的準備程式來提高應用速度
MAX_SERVERS=40--設定最大可使用的程式數,要大於所有的APPLY、PREPARE、ANALYZE等程式之和
----設定以上並行引數的時候,要注意PARAMETER中的PARALLEL引數相關的設定也要能支援上面的調整。
_EAGER_SIZE=4001--這個是一個隱含的引數,用來設定大事務和小事務時間的分界線,更新記錄行數大於此值的被認為是大事務,提高這個引數的設定對大事務的應用有提高。查詢v$logstdby_stats檢視,如果沒有很多的bytes paged out的話,說明這個引數還可以設定的更大。
MAX_SGA=2048--LCR可使用的SGA大小,如果過小則會產生很多的PAGE OUT,可以調整此SGA的大小,此SGA是資料SHARED POOL中的一部分的,所以要保證SHARED POOL也足夠大
PRESERVE_COMMIT_ORDER = FALSE--設定事務不按照嚴格的主庫上事務發生的順序來進行應用,也可以提高應用的速度。
3、如果以上招數都不能解決問題,那可能就是碰到了ORACLE的BUG了,參考5327658.8,上面說到如果更新百萬級大表的話,可能造成STANDBY的應用非常慢,可以透過升級來解決問題,需要升級到10.2.0.4或者11.1.0.6。
4、我這次千萬級的更新使用了2的方法後,還是應用很慢,整整一天應用都沒有同步過來,後來發現可以把一個表的DML操作SKIP掉,然後重新同步這個表來實現。於是先使用dbms_logstdby.skip把這個表所有的DML操作全部忽略,加速應用,等到積累的日誌全部應用完成後,使用dbms_logstdby.instantiate_table進行表的同步,結果發現這個同步操作也是很慢,半個多小時了還是在進行中,於是取消操作。後來發現dbms_logstdby.instantiate_table基本上就是在STANDBY庫先把表刪除,然後再使用IMPDP把這個表的資料透過DBLINK導過來。既然這樣可以,那就手工做吧。
5、把STANDBY的APPLY停下來,然後查詢STANDBY的V$LOGSTDBY_PROGRESS,得到當前的APPLY_SCN,那麼利用主庫的FLASHBACK特性,先把STANDBY的表TRUNCATE掉,然後使用INSERT /*+ APPEND*/ INTO TABLE SELECT * FROM AS SCN OF XX把資料導過來,其中的XX就是上面查到的APPLY_SCN。這當中其實就是大家很熟悉的導資料操作了,可以使用先刪除索引,匯入完了再重建,使用APPEND提示等等多種手段來提高匯入的速度。
6、經過10多分鐘,資料導完,建完索引,整個過程不到半個小時,比dbms_logstdby.instantiate_table還快一些,雖然繁瑣,但是過程比較透明,出現問題也容易處理的多。
建議和總結:
1、方法2中的很多引數在平時的日誌應用中就可是設定好來加速日誌應用速度。
2、對於大批次的資料更新,儘量使用分批提交的方式,把大事務拆分成小的事務,而且進行要比_EAGER_SIZE引數設定的要小一些
3、PRESERVE_COMMIT_ORDER引數在日誌同步完成後,為了保證事務和生產上的順序一致,最好把這個引數使用DBMS_LOGSTDBY.APPLY_UNSEGT取消。
4、因為主庫的一個DML的操作在STANDBY庫會被分解成一個個單獨的更新的sql,所以可以合理利用規則來SKIP這些DML,然後再手工同步的方式來進行
5、有可能的話,升級資料庫系統
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25016/viewspace-1005736/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL主從資料庫同步延遲問題怎麼解決MySql資料庫
- MySQL:雙主單寫 主庫偶爾出現大量延遲的原因MySql
- SQLServer資料庫日誌太大處理方式SQLServer資料庫
- 前端如何處理十萬級別的大量資料前端
- 通過RMAN設定standby接收日誌後主庫歸檔日誌才可刪除
- 技術分享 | 用圖資料庫來降低 MySQL 處理多層關係的延遲(一)資料庫MySql
- guava cache大量的WARN日誌的問題分析Guava
- 資料庫主機重啟卡住問題處理分享資料庫
- MySQL主從複製延遲原因及處理思路MySql
- 簡單的幾條Insert語句引起的邏輯Standby應用延遲的診斷
- 你知道MySQL是如何處理千萬級資料的嗎?MySql
- Oracle資料庫中的逐行處理問題NEOracle資料庫
- PHP 結合 MySQL 千萬級資料處理PHPMySql
- 教你如何解決MySQL資料延遲跳動的問題MySql
- 如何避免MYSQL主從延遲帶來的讀寫問題?MySql
- 千萬級資料庫使用索引查詢速度更慢的疑惑-資料回表問題資料庫索引
- PHP+MySQL 千萬級資料處理案例(一)PHPMySql
- 在`Laravel`中使用`cursor`來查詢並處理資料 (輕鬆處理千萬級的資料)Laravel
- 在Laravel中使用cursor來查詢並處理資料 (輕鬆處理千萬級的資料)Laravel
- [20190124]bbed恢復資料遇到延遲塊清除的問題.txt
- Jtti:redis主從延遲資料不一致問題如何解決JttiRedis
- 分析伺服器延遲的問題伺服器
- MySQL查詢中Sending data佔用大量時間的問題處理MySql
- 小程式處理大量資料列表的方法
- 如何處理Oracle資料庫中的壞塊問題(轉)Oracle資料庫
- 使用資料庫處理併發可能導致的問題資料庫
- python中多程式處理資料庫連線的問題Python資料庫
- JDBC用ResultSet訪問大量資料時會遇到的問題JDBC
- 揭秘|每秒千萬級的實時資料處理是怎麼實現的?
- MySQL5.6升級5.7時,出現主從延遲問題排查過程MySql
- orbeon form 的日誌處理ORBORM
- [20210529]延遲開啟資料庫.txt資料庫
- 應用使用JNDI,資料庫無法連線,導致的程序無法啟動問題處理資料庫
- 幾種常見的延遲執行處理方式
- PHP+MySQL 千萬級資料處理案例(二) 分表的意義PHPMySql
- 用PHP的生成器yield處理大量資料,確實很快!PHP
- SQLServer 2008中事務日誌已滿問題處理SQLServer
- 資料處理--pandas問題