達夢數據庫學習(三、體系結構)
上期內容:
本篇說實在的有些我也沒太弄明白,大概就是知其然不知其所以然吧。
DMServer=客戶端+服務器 (典型的C/S架構)
而服務器=數據庫+實例
一、database數據庫(存放到磁盤的文件)
文件分類
1、數據文件
存放用戶的真實的數據(物理備份時備份的就是這些文件)
2、重做日志文件
(注:達夢數據庫沒有日志組的概念,達夢不支持手動切換日志)
存放的是改變的數據信息(這個最怕出問題,重做日志文件丟失可能會丟失數據,因此需要對重做日志做歸檔)
查看文件路徑
SQL>select path from v$rlogfile;
行號 PATH
---------- -----------------------------
1 /dm8/data/DAMENG/DAMENG01.log
2 /dm8/data/DAMENG/DAMENG02.log
1)、如何調整日志文件大小(達夢限制只能調大不能調小) 大小范圍:64M-2G
查看日志文件的大小:
SQL>select path,rlog_size/1024/1024 from v$rlogfile;
行號 PATH RLOG_SIZE/1024/1024
---------- ----------------------------- --------------------
1 /dm8/data/DAMENG/DAMENG01.log 256
2 /dm8/data/DAMENG/DAMENG02.log 256
調整大小:
SQL> alter database resize logfile '/dm8/data/DAMENG/DAMENG01.log' to 257
SQL> alter database resize logfile '/dm8/data/DAMENG/DAMENG02.log' to 257
注意:所有的日志文件大小要一致(我沒試過不一致會怎樣)
特點:循環寫,重復寫
2)、如何增加一個日志文件(達夢只支持增加,不支持刪除)
SQL> alter database add logfile '/dm8/data/DAMENG/DAMENG03.log' size 257;
3、控制文件
Oracle數據庫的控制文件內容:SCN、歸檔信息、RMAN備份的元數據
數據庫的物理架構v$controlfile
達夢數據庫的控制文件內容:數據庫的物理架構、版本信息、創建時間、OGUID等
查找控制文件的路徑:
SQL> select para_name,para_value from v$dm_ini where para_name='CTL_PATH';
行號 PARA_NAME PARA_VALUE
---------- --------- -----------------------
1 CTL_PATH /dm8/data/DAMENG/dm.ctl
達夢對控制文件的保護:控制文件很重要,所以要避免該文件丟失或損壞,在Oracle中可以進行復制,使用多個位置存放控制文件,那么在達夢里面,達夢進行了自動備份。
自動備份(備份路徑,備份的個數)
SQL> select para_name,para_value from v$dm_ini where para_name='CTL_BAK_PATH';
行號 PARA_NAME PARA_VALUE
---------- ------------ ------------------------
1 CTL_BAK_PATH /dm8/data/DAMENG/ctl_bak
SQL> select para_name,para_value from v$dm_ini where para_name='CTL_BAK_NUM';
行號 PARA_NAME PARA_VALUE
---------- ----------- ----------
1 CTL_BAK_NUM 10
比較奇怪的是這里寫的備份數量是10,但實際查看路徑下有11個文件
查看備份文件的內容:
把控制文件轉成文本文件:
$ ./dmctlcvt type=1 src=/dm8/data/DAMENG/dm.ctl dest=/tmp/dm.txt
vi /tmp/dm.txt
4、配置文件
配置文件多數以.ini結尾
比如dm.ini就是很典型的參數配置文件
參數的類型:SYS、session、read only、in file(以上參數類型不明白啥意思)上網查了一下:
read only:手動參數,表示服務器運行過程中不可修改;
infile:靜態參數,只可修改ini文件
SYS及session:動態參數,ini文件和內存同時可修改,其中SYS是系統級參數
手動:不能被動態修改,必須手動修改dm.ini參數文件,然后重啟才能生效。
靜態:可以被動態修改,修改后重啟服務器才能生效。
動態:可以被動態修改,修改后即時生效。動態參數又分為會話級和系統級兩種。會話級參數被修改后,新參數值只會影響新創建的會話,之前創建的會話不受影響;系統級參數的修改則會影響所有的會話。
參考網址:
https://blog.csdn.net/weixin_50334974/article/details/108776379
修改參數:sp_set_para_value(修改范圍,參數名,參數值)
修改范圍:1=內存+參數文件,2=參數文件
查看參數類型:
SQL>select para_name,para_value from v$dm_ini where para_name=’BUFFER’;
SQL>sp_set_para_value(2,’BUFFER’,’500’);--兩種方式之一
SQL>alter system set ‘BUFFER’=500 spfile;--兩種方式之二
配置文件示例:dmarchar.ini(配置歸檔)、dmmal.ini(MAL鏈路通訊)、dmmpp.ini(MPP配置)
5、其他文件
如備份文件、追蹤文件等
二、實例
實例=共享內存+后台的進程或者線程
1、共享內存 為了減少物理IO
設置共享內存大小
SQL>select para_name,para_value from v$dm_ini where para_name=’MEMEROY_TARGET’;
BUFFER 數據緩沖區
作用:存放最近使用的數據塊(讀,修改)
查看大小:
SQL>select para_name,para_value from v$dm_ini where para_name=’BUFFER’;
區域的大小設置:OLTP系統建議是物理內存的40%-60%.
LRU鏈表上,數據庫是有以下狀態的(臟、干凈、空閑、正在使用)
要把磁盤的數據庫塊讀到BUFFER,找LRU鏈表,遇到干凈的和空閑的直接使用,遇到臟數據塊,把它放到檢查點隊列上,遇到在使用的直接跳過。
如何判斷數據是否在內存中:通過HASH鏈表。不懂
Oracle:keep 和recycle存放的是表。達夢存放的是表空間。
keep(保留池)
RECYCLE(回收池)
REDO LOG BUFFER 重做日志緩沖區
作用:存放修改的數據塊
查看大小:
SQL>select para_name,para_value from v$dm_ini where para_name=’RLOG_BUF_SIZE’;
單位:page,調整大小建議是2的冪(如2的6次方)。
對於redo log buffer 的數據,3秒會自動寫磁盤,事務提交的時候也會寫磁盤(因此調整這個REDO LOG BUFFER大小就沒有太大意義,實際會很少調這個大小)
字典緩沖區
作用:存放最近使用的數據字典(system),減少物理讀(減少物理IO)
查看大小:
SQL>select para_name,para_value from v$dm_ini where para_name=’DICT_BUF_SIZE’;
SQL緩沖區
作用:存放最近使用SQL語句(hash或者SQLid)、執行計划、最近的查詢結果集
查看大小:
SQL>select para_name,para_value from v$dm_ini where para_name=’CACHE_POOL_SIZE’;
對應找緩存SQL的話有兩個視圖:v$sql_history、v$sqltext
執行計划:是否重用
SQL>select para_name,para_value from v$dm_ini where para_name=’USE_PLN_POOL’;
0 不重用
1 重用,默認是1 減少執行計划的解析
排序區
作用:用作排序
查看大小:
SQL>select para_name,para_value from v$dm_ini where para_name=’SORT_BUF_SIZE’;
注意:如果排序區無法完成所有的排序,會把部分排序的動作放到磁盤,會放在臨時表空間。
HASH區
作用:緩存hash值,兩張表做hash join,其中一張表產生hash值,把hash值放到該區域。
查看大小:
SQL>select para_name,para_value from v$dm_ini where para_name=’HJ_BUF_SIZE’;
了解一條SQL語句的執行過程:
1、語法分析
2、語義分析(數據字典,常用的數據字典緩存到字典緩存區)
3、權限判斷(字典緩沖區)
4、找執行計划(SQL緩沖區),(有則調到第5步,無則把數據讀到內存(數據緩沖區),如果修改,把修改的數據放到重做日志緩沖區。生成SQL的執行計划(SQL緩沖區))
5、運行執行計划
6、返回結果(SQL緩沖區)
2、后台進程或者線程
1、利用操作系統
找到數據庫的進程號:
#ps -ef | grep dmsever
A、top -p 進程號 -H
B、/proc/進程編號
這個不懂啥意思。
2、利用數據庫的動態性能視圖
SQL>select name,thread _desc from v$threads;
也不懂啥意思。
監聽線程 默認監聽端口5236 檢測外部連接
IO線程 刷臟數據(把檢查點隊列的數據寫到磁盤)
工作線程 執行任務(調度分配的任務)
調度線程 分配任務給工作線程,喚醒工作線程,垃圾回收(回收失效的段等)
日志刷新線程 把重做日志緩沖區的數據寫到重做日志中
日志重做線程 數據庫異常關閉,下次啟動的時候,會把重做日志的一些未寫磁盤的臟數據重構(Oracle實例恢復)
日志歸檔 把重做日志寫到歸檔文件(Orale歸檔---日志切換,達夢是同時寫重做日志和歸檔)(個人理解達夢的同時寫並不是真正的同時,還是有延時的)
SQL>alter system switch logfile;
該操作並不是執行日志切換
個人理解該操作的實際意義是立即進行了歸檔寫
檢查點線程 觸發增量檢查點和完全檢查點(觸發完全檢查點會寫臟數據到磁盤,增量檢查點不一定會寫臟數據到磁盤)。
總結:
注:該圖直接拷貝授課老師教材,感謝。