達夢資料庫日常運維管理手冊
1、 資料庫基礎操作
1.1. 建立表空間
例,以 SYSDBA 身份登入資料庫後,建立表空間 TS1,指定資料檔案 TS1.dbf,大小128M。
CREATE TABLESPACE TS1 DATAFILE 'd:\TS1.dbf' SIZE 128 AUTOEXTNED ON NEXT 256;
注意事項:
1. 表空間名在資料庫中必須唯一;
2. 一個表空間中,資料檔案和映象檔案一起不能超過 256 個;
3. 如果全庫已經加密,就不再支援表空間加密;
4. SYSTEM 表空間不允許關閉自動擴充套件,且不允許限制空間大小。
5. 表空間資料檔案的路徑一定要在規劃的資料盤上,避免空間不足。
6. MPP、DSC叢集環境在建立表空間時,資料檔案寫資料檔名即可,不需要寫絕對路徑,寫絕對路徑可以會出現錯誤。
1.2. 表空間增加資料檔案
例,單個數據檔案過大不利於資料庫的運維管理,為已有的表空間TS1 增加一個新的資料檔案,並設定這個資料檔案最大上限1000G
ALTER TABLESPACE TS1 ADD DATAFILE 'd:\TS1.dbf' SIZE 128 AUTOEXTNED ON NEXT 256 MAX 102400;
1.3. 建立使用者
例,建立使用者名稱為 BOOKSHOP_USER、口令為 BOOKSHOP_PASSWORD使用者,併為使用者指定預設表空間。
CREATE USER BOOKSHOP_USER IDENTIFIED BY BOOKSHOP_PASSWORD DEFAULT TABLESAPCE TS1;
也可在管理工具中建立使用者,使用者-管理使用者-右鍵-新建使用者
注意事項:
- 新建使用者一定要為使用者指定預設表空間,否則會使用預設系統表空間,不利於以後的維護和擴充套件;
1.4. 使用者授權
例,給TEST使用者授予許可權
grant public,resource to "TEST";
同樣也可在管理工具中更改使用者許可權,使用者-管理使用者-TEST使用者-右鍵-修改
注意事項:
1. dba角色不要輕易授予,臨時授權需要及時回收;
1.5. 建立索引
例,在 emp 表的 ename 列上建立一個名為 idx_emp_ename 的索引,並指定該索引使用表空間 users。
CREATE INDEX idx_emp_ename ON emp(ename) STORAGE (ON USERS);
注意事項:
- 建立索引會鎖表,影響表上的刪除、更新、插入等操作,要在確保沒有操作的表上建立索引;
- 不指定索引使用的表空間,預設會使用使用者的預設表空間。
1.6. 建立唯一索引
可用 CREATE UNIQUE INDEX 語句來建立唯一索引,如下例子建立一個唯一索引:
CREATE UNIQUE INDEX dept_unique_index ON dept (dname) STORAGE (ON users);
1.7. 建立函式索引
例如, WHERE 子句中的表示式使用了函式,通過函式索引可以提高查詢效率
CREATE INDEX IDX ON EXAMPLE_TAB(avg(column))
SELECT * FROM EXAMPLE_TAB WHERE avg(column) < 10;
1.8. 建立主鍵
如下面的語句會自動在表emp的name列上建立一個唯一索引。
ALTER TABLE EMP ADD CONSTRAINT PK_EMP_NAME PRIMARY KEY (NAME);
1.9. 檢視所有會話
select * from v$sessions;
1.10. 檢視活動會話
select * from v$sessions where state='ACTIVE';
1.11. 檢視最慢20條SQL
select TOP 20* from V$SYSTEM_LONG_EXEC_SQLS ORDER BY EXEC_TIME DESC;
1.12. 檢視最近的20條慢sql
select * from V$LONG_EXEC_SQLS order by EXEC_TIME DESC limit 0,20;
2、 常見問題處理
2.1. 鎖表的處理
鎖表的問題主要是多個事務同時對一張表進行更新、刪除造成,一個事務對錶加鎖未釋放前,其他事務無法再次進行加鎖,處於等待狀態。
2.1.1. 查詢正在執行的事務
select
tw.id as "等待的事務ID",
tw.wait_for_id as "正在執行的事務ID",
s.sess_id as "等待的會話",
ws.sess_id as "正在執行的會話",
s.sql_text as "等待的sql",
ws.sql_text as "正在執行的sql" ,
cast(ws.rowid as varbinary ) >> 58 "執行節點號",
'SP_CLOSE_SESSION('||ws.sess_id||');' "關閉會話的語句"
from v$trxwait tw left join v$sessions s
on tw.id=s.trx_id
left join v$sessions ws
on tw.wait_for_id=ws.trx_id;
#######
#"正在執行的事務ID":處於等待狀態的事務ID;
#"等待的事務ID":正在執行的事務ID;
#"正在執行的會話":處於等待狀態的會話ID
#"等待的會話":正在執行的會話ID;
#"等待的sql":等待執行的SQL;
#"正在執行的sql":正在執行的SQL;
#"執行節點號":正在執行的SQL執行在哪個EP節點;
#"關閉會話的語句":關閉會話的執行語句;
2.1.2. 通過SESS_ID關閉會話
通過SQL_TEXT判斷需要關閉的會話,通過上一步操作,可以提取出關閉阻塞會話的執行語句。
SP_CLOSE_SESSION(#SESSID);
2.1.3. MPP場景的鎖處理
MPP是分散式資料庫,事務會分發到多個節點上同時執行,通過全域性登入查詢會看到所有節點上的會話資訊,如果需要關閉某一個事務,需要將所有節點上的相關事務的會話都要關閉才可以。
以下命令需要在MPP多個節點同時進行執行:
./disql 使用者名稱/密碼#{MPP_TYPE=local}--MPP叢集需要local登入
SP_SET_SESSION_LOCAL_TYPE (1);--允許本地登入執行DDL操作命令
SP_CLOSE_SESSION(#SESSID);
2.2. 資料庫慢分析過程
2.2.1. 檢查資源使用情況
free -g
vmstat 1
ps -aux | sort -k4nr | head -10
通過以上檢查,可以分析記憶體使用情況,並找到記憶體佔用最高的程序是哪些,從而對佔用資源較高的程序進行分析。
2.2.2. 檢查磁碟IO情況
iostat -xm -t 1
通過以上檢查,可以分析是否有大量的讀寫在進行;
如果大量的寫入,可以分析是否有正在執行的程序在做批量的插入操作,是否是正常的業務程序,是否可以在非業務高峰期進行。
如果有大量的讀取需要分析是否有大表未使用索引,造成大資料量的全表掃描。
2.2.3. 檢查資料庫活動sessions
select count(*) from v$sessions;
select PARA_NAME,PARA_VALUE from v$dm_ini where para_name ='MAX_SESSIONS';
select count(*) from v$sessions where state='ACTIVE';
select * from v$sessions where state='ACTIVE';
通過以上檢查可以分析是否連線會話數達到上線,造成會話連線等待。
如果活動會話數持續居高不下,需要具體分析活動的會話執行內容,是否存在死鎖等待造成會話無法結束,是否存在應用程式異常操作。
2.2.4. 查詢資料庫中的慢sql
select * from V$LONG_EXEC_SQLS order by EXEC_TIME DESC limit 0,20;
通過以上檢查可以分析資料中執行較慢的SQL,如果sql執行慢且執行頻率高,必須進行優化,否則可能會造成資料庫整體執行緩慢。
通過以上分析基本可以定位大部分資料庫執行緩慢問題。如果通過以上分析依然無法準確定位問題,可以進行後續的堆疊分析。堆疊分析需要相關專家參與進行結果分析。
2.2.5. 檢視資料庫程序的資源使用情況
(1)提取程序號
ps -ef |grep dmserver
(2)檢視資料庫程序下,各執行緒的資源使用情況
ps -eLo pcpu,pmem,pid,tid,psr,wchan:14,comm|grep 程序號 |sort
2.2.6. 抓取消耗資源最高的執行緒堆疊資訊
(1)堆疊資訊抓取
pstack 程序號 |grep -A 14執行緒號
[dmdba@localhost ~]$ pstack 15248 |grep -A 14 2266805
Thread 241 (LWP 2091011):
#0 0x000000000053d790 in nrec_get_nth_fld_with_prev_offset ()
#1 0x0000000000d007c8 in cscn2_exec_fill_data_all_visible ()
#2 0x0000000000d01d34 in cscn2_exec_fetch ()
#3 0x0000000000d056b8 in cscn2_exec ()
#4 0x0000000000e4a340 in vm_run_low ()
#5 0x0000000000e4a5f0 in vm_run ()
#6 0x0000000000e4bb84 in vm_run_mpln ()
#7 0x00000000011fec20 in mtsk_process_mpln ()
#8 0x0000000001215d34 in mtsk_process_mal_letter_for_mpp ()
#9 0x00000000011144e4 in uthr_db_main_for_msess ()
#10 0x0000ffffa75e88cc in ?? () from /lib64/libpthread.so.0
#11 0x0000ffffa727a1ec in ?? () from /lib64/libc.so.6
(2)輸出堆疊資訊,提交給相關專家進一步分析
[dmdba@localhost ~]$ pstack 15248 > /tmp/15248.txt