當前位置:首頁 » 數據倉庫 » 資料庫問題分析
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

資料庫問題分析

發布時間: 2022-12-16 10:54:03

1. 資料庫錯誤50000的原因分析

一般伺服器意外重啟或者安裝插件都會造成數據表的損壞,導致論壇無法訪問或者提示資料庫報錯,出現這種問題時,需要修復資料庫,本教程主要針對數據表損壞的修復操作進行簡單介紹。
1、使用 Discuz! Tools 工具修復資料庫 放根目錄
工具自己官網搜下 我這個等級沒法發鏈接

打開 tools.php 文件,在文件頭部找到:
$tool_password = ''; // ☆★☆★☆★ 請您設置一個工具包的高強度密碼,不能為空!☆★☆★☆★ 在這里設置該工具包的密碼,注意不能為空!
然後檢查 恢復資料庫 】】

2、使用 phpMyadmin 修復數據的方法
進入論壇資料庫,然後選擇要修復的表,在頁腳下拉框選擇「修復」即可。
3、獨立主機的修復數據方法
修復前請一定將 Mysql 服務停止。
如果是 Win 主機,打開命令行方式,然後進入到 MySQL 的 bin 目錄。
執行
myisamchk -r d:\MySQL\data\discuz\*.MYI 其中 d:\MySQL\data\discuz\ 換成您的資料庫所在路徑。
如果是類 Unix 主機,直接使用 myisamchk -r 資料庫目錄 \*.MYI 。

2. sql資料庫質疑的原因及解決辦法

sql資料庫質疑是設置錯誤造成的,解決方法為:

1、通過DBCC CHECKCB('DBName') 來檢測資料庫異常的原因,如果可以檢測到資料庫的異常,其中紅色部分即時數據目前存在的問題,我們也在檢測結果最後看到數據的總體的錯誤情況的匯總。

3. 哪些因素影響了資料庫性能

網路寬頻,磁碟IO,查詢速度都會影響到資料庫的性能。

具體問題具體分析,舉例來說明為什麼磁碟IO成瓶頸資料庫的性能急速下降了。

為什麼當磁碟IO成瓶頸之後, 資料庫的性能不是達到飽和的平衡狀態,而是急劇下降。為什麼資料庫的性能有非常明顯的分界點,原因是什麼?

相信大部分做資料庫運維的朋友,都遇到這種情況。 資料庫在前一天性能表現的相當穩定,資料庫的響應時間也很正常,但就在今天,在業務人員反饋業務流量沒有任何上升的情況下,資料庫的變得不穩定了,有時候一個最簡單的insert操作, 需要幾十秒,但99%的insert卻又可以在幾毫秒完成,這又是為什麼了?

dba此時心中有無限的疑惑,到底是什麼原因呢? 磁碟IO性能變差了?還是業務運維人員反饋的流量壓根就不對? 還是資料庫內部出問題?昨天不是還好好的嗎?

當資料庫出現響應時間不穩定的時候,我們在操作系統上會看到磁碟的利用率會比較高,如果觀察仔細一點,還可以看到,存在一些讀的IO. 資料庫伺服器如果存在大量的寫IO,性能一般都是正常跟穩定的,但只要存在少量的讀IO,則性能開始出現抖動,存在大量的讀IO時(排除配備非常高速磁碟的機器),對於在線交易的資料庫系統來說,大概性能就雪崩了。為什麼操作系統上看到的磁碟讀IO跟寫IO所帶來的性能差距這么大呢?

如果親之前沒有注意到上述的現象,親對上述的結論也是懷疑。但請看下面的分解。

在寫這個文章之前,作者閱讀了大量跟的IO相關的代碼,如非同步IO線程的相關的,innodb_buffer池相關的,以及跟讀數據塊最相關的核心函數buf_page_get_gen函數以及其調用的相關子函數。為了將文章寫得通俗點,看起來不那麼累,因此不再一行一行的將代碼解析寫出來。

咱們先來提問題。buf_page_get_gen函數的作用是從Buffer bool裡面讀數據頁,可能存在以下幾種情況。

提問. 數據頁不在buffer bool 裡面該怎麼辦?

回答:去讀文件,將文件中的數據頁載入到buffer pool裡面。下面是函數buffer_read_page的函數,作用是將物理數據頁載入到buffer pool, 圖片中顯示

buffer_read_page函數棧的頂層是pread64(),調用了操作系統的讀函數。


通過解析buf_wait_for_read函數的下層函數,我們知道其實通過首先自旋加鎖pin的方式,超過設定的自旋次數之後,進入等待,等待IO完成被喚醒。這樣節省不停自旋pin時消耗的cpu,但需要付出被喚起時的開銷。

再繼續擴展問題: 如果會話線程A 經過物理IO將數據頁1001讀入buffer之後,他需要修改這個頁,而在會話線程A之後的其他的同樣需要訪問數據頁1001的會話線程,即使在數據頁1001被入讀buffer pool之後,將仍然處於等待中。因為在數據頁上讀取或者更新的時候,同樣需要上鎖,這樣才能保證數據頁並發讀取/更新的一致性。

由此可見,當一個高並發的系統,出現了熱點數據頁需要從磁碟上載入到buffer pool中時,造成的延遲,是難以想像的。因此排在等待熱點頁隊列最後的會話線程最後才得到需要的頁,響應時間也就越長,這就是造成了一個簡單的sql需要執行幾十秒的原因。

再回頭來看上面的問題,mysql資料庫出現性能下降時,可以看到操作系統有讀IO。 原因是,在資料庫對數據頁的更改,是在內存中的,然後通過檢查點線程進行非同步寫盤,這個非同步的寫操作是不堵塞執行sql的會話線程的。所以,即使看到操作系統上有大量的寫IO,資料庫的性能也是很平穩的。但當用戶線程需要查找的數據頁不在buffer pool中時,則會從磁碟上讀取,在一個熱點數據頁不是非常多的情況下,我們設置足夠大的innodb_buffer_pool的size, 基本可以緩存所有的數據頁,因此一般都不會出現缺頁的情況,也就是在操作系統上基本看不到讀的IO。 當出現讀的IO時,原因時在執行buf_read_page_low函數,從磁碟上讀取數據頁到buffer pool, 則資料庫的性能則開始下降,當出現大量的讀IO,資料庫的性能會非常差。

4. 目前資料庫發展過程中軟硬體的都面臨了什麼難題

國產硬體和國外高端產品還是存在一定差距,並且隨著存儲單元密度接近摩爾定律極限,數據存儲及處理器晶體密度將達到上限,這方面是硬體的限制。技術上對的限制或簡單來說就是資料庫應用場景的多樣性復雜性的問題,性能瓶頸、運維、兼容、場景類型...。因為應用場景的復雜性和多樣性,單一場景的資料庫很難適應目前數字化發展的趨勢,所以各類資料庫廠家也在兼容融合等方面發力,HTAP就是很好的例子。AntDB在運營商深耕了十幾年,覆蓋了OLTP與OLAP場景,是非常典型的HTAP類型的關系型資料庫,業務覆蓋計費、CRM等核心交易,同時覆蓋清算分析等分析型業務。比如AntDB資料庫服務於中國電信某省計費系統上雲,包含數據層、批價和出賬流程等大規模業務。在系統設計上,將資源、資產等交易熱數據遷移到AntDB資料庫,極大地提高了業務關鍵數據的訪問效率,整體提高了話單事務的處理性能。AntDB資料庫支撐10億用戶的通信交易場景,進行在線交易與數據分析處理的HTAP混合負載,幫助客戶解決核心系統解決海量數據管理難題,基於分布式的架構設計,實現了在線彈性伸縮、強一致性事務、跨機房高可用等能力。

5. 資料庫問題

您好,是這樣的:
1.首先確認已經備份了.mdf和.ldf文件。
2.
在SQL
Server中新建一個同名的資料庫,然後停止SQL
Server服務。
3.
用原有的.mdf和.ldf文件覆蓋新建資料庫對應的.mdf和.ldf文件。
4.
重新啟動SQL
Server服務,這是應該會看到這個資料庫處於置疑(Suspect)狀態。
5.
在SQL查詢分析器中執行以下命令,以允許更新系統表:use
mastergosp_configure
"allow
updates",1reconfigurewithoverridego。
6.
將這個資料庫置為緊急模式:update
sysdatabases
set
status
=
32768
where
name="db_name"go。
7.
使用DBCC
CHECKDB命令檢查資料庫中的錯誤:DBCC
CHECKDB("db_name")GO。
8.
如果DBCC
CHECKDB命令失敗,請轉至第10步,否則先將資料庫置為單用戶模式,再嘗試對其進行修復:sp_dboption
"db_name","single
user","true"DBCCCHECKDB("db_name",REPAIR_ALLOW_DATA_LOSS)GO
如果在執行DBCCCHECKDB("db_name",REPAIR_ALLOW_DATA_LOSS)命令時提示說資料庫未處於單用戶模式狀態的話,則重新啟動SQLServer服務,然後繼續嘗試。
9.
如果DBCCCHECKDB("db_name",REPAIR_ALLOW_DATA_LOSS)命令失敗,請轉至第10步,否則若成功修復了資料庫中的錯誤:
重新執行DBCC
CHECKDB("db_name")命令,確認資料庫中已沒有錯誤存在。
清除資料庫的置疑狀態:sp_resetstatus
"db_name"
清除資料庫的單用戶模式狀態:sp_dboption
"db_name","single
user","false"
重新啟動SQL
Server服務,如果一切正常的話,則資料庫已經成功恢復。
10.如果以上步驟都不能解決問題的話,請參考附件中的文檔嘗試通過重建事務日誌來恢復資料庫中的數據。如果您只有MDF文件,問題就更加復雜一些,我們需要直接重建事務日誌了:
1.
在SQL
Server中新建一個同名的資料庫,然後停止SQL
Server服務。
2.
用原有的ldf文件覆蓋新建資料庫對應的.mdf文件,將其日誌文件(.ldf)刪除。
3.
啟動SQL
Server服務,並將資料庫置為緊急模式(同上:
步驟5和步驟6)。
4.
停止並重新啟動SQL
Server服務。
5.
執行以下命令重建資料庫日誌文件:(下面是個示例,您要用您實際的資料庫名)
DBCC
REBUILD_LOG("cas_db",
"D:\cas_db\cas_db_Log.LDF")
6.
重新將該資料庫置為單用戶模式。
7.
再次嘗試使用DBCC
CHECKTABLE或DBCC
CHECKDB命令檢查並修復資料庫中。

6. 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 變數,想法破滅。

7. 如何分析資料庫

1、首先你要研究那個網站是幹啥的,涉及的行業,畢竟隔行如隔山嘛。
2、自己模擬他的資料庫,分析所有用到的數據,然後分類,然後根據1-4範式寫成庫。
3、對照自己的庫,看看那部分比較薄弱,從最弱的環節侵入。
4、你有空研究這些,不如研究破開網站,找到他的庫的用戶名和密碼,囧!