f 四月 2021 ~ 迪貝之家

Microsoft SQL Server Log Shipping

SQL 7就有的技術,簡單的說就是資料庫複本資料同步的技術,而這份複本可以開放讀取的功能以分散營業資料庫的負載,也可純粹當成備援資料庫,不管是在本地還是異地。怎麼達成? 透過SQL Agent自動化排程進行備份、傳檔及復原等作業。

Oracle GolGateden

機房搬遷跨Site能即時同步資料庫利器

Nagios 資料庫維運自動化

一開始設計這架構時,就排除使用remote agent的想法因為在專業分工的組織下,要求安裝新軟體於既有系統是一件不太可行的方案,既然身為DBA就只能把資料庫instance當作是一個最大的agent 想辦法在資料庫內做到我想做的事情

This is default featured post 4 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured post 5 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

從sql cache 進行sql access advisor(SAA) 分析index及mview

 1. Cached SQL  -> STS 

    and then create analyzing task

 2. Generate recommend scripts

權限 :

Assume  steven is the user to run SQL access advisor.

SQL> grant all on dbms_advisor to steven;

SQL> grant advisor to steven;

SQL> grant ADMINISTER SQL TUNING SET to steven;


1. 是由EM 產出的語法,我跑12c 是ok的

DECLARE
  taskname varchar2(30) := 'SQLACCESS3638195';
  task_desc varchar2(256) := 'SQL Access Advisor';
  task_or_template varchar2(30) := 'SQLACCESS_EMTASK';
  task_id number := 0;
  num_found number;
  sts_name varchar2(256) := 'SQLACCESS3638195_sts';
  sts_cursor dbms_sqltune.sqlset_cursor;
BEGIN
  /* Create Task */
  dbms_advisor.create_task(DBMS_ADVISOR.SQLACCESS_ADVISOR,
                           task_id,
                           taskname,
                           task_desc,
                           task_or_template);

  /* Reset Task */
  dbms_advisor.reset_task(taskname);

  /* Delete Previous STS Workload Task Link */
  select count(*)
  into   num_found
  from   user_advisor_sqla_wk_map
  where  task_name = taskname
  and    workload_name = sts_name;
  IF num_found > 0 THEN
    dbms_advisor.delete_sqlwkld_ref(taskname,sts_name,1);
  END IF;

  /* Delete Previous STS */
  select count(*)
  into   num_found
  from   user_advisor_sqlw_sum
  where  workload_name = sts_name;
  IF num_found > 0 THEN
    dbms_sqltune.delete_sqlset(sts_name);
  END IF;

  /* Create STS */
  dbms_sqltune.create_sqlset(sts_name, 'Obtain workload from cursor cache');

  /* Select all statements in the cursor cache. */
  OPEN sts_cursor FOR
    SELECT VALUE(P)
    FROM TABLE(dbms_sqltune.select_cursor_cache) P;

  /* Load the statements into STS. */
  dbms_sqltune.load_sqlset(sts_name, sts_cursor);
  CLOSE sts_cursor;

  /* Link STS Workload to Task */
  dbms_advisor.add_sqlwkld_ref(taskname,sts_name,1);

  /* Set STS Workload Parameters */
  dbms_advisor.set_task_parameter(taskname,'VALID_ACTION_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
  dbms_advisor.set_task_parameter(taskname,'VALID_MODULE_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
  dbms_advisor.set_task_parameter(taskname,'SQL_LIMIT','25');
  dbms_advisor.set_task_parameter(taskname,'VALID_USERNAME_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
  dbms_advisor.set_task_parameter(taskname,'VALID_TABLE_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
  dbms_advisor.set_task_parameter(taskname,'INVALID_TABLE_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
  dbms_advisor.set_task_parameter(taskname,'INVALID_ACTION_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
  dbms_advisor.set_task_parameter(taskname,'INVALID_USERNAME_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
  dbms_advisor.set_task_parameter(taskname,'INVALID_MODULE_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
  dbms_advisor.set_task_parameter(taskname,'VALID_SQLSTRING_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
  dbms_advisor.set_task_parameter(taskname,'INVALID_SQLSTRING_LIST','"@!"');

  /* Set Task Parameters */
  dbms_advisor.set_task_parameter(taskname,'ANALYSIS_SCOPE','ALL');
  dbms_advisor.set_task_parameter(taskname,'RANKING_MEASURE','PRIORITY,OPTIMIZER_COST');
  dbms_advisor.set_task_parameter(taskname,'DEF_PARTITION_TABLESPACE',DBMS_ADVISOR.ADVISOR_UNUSED);
  dbms_advisor.set_task_parameter(taskname,'TIME_LIMIT',10000);
  dbms_advisor.set_task_parameter(taskname,'MODE','LIMITED');
  dbms_advisor.set_task_parameter(taskname,'STORAGE_CHANGE',DBMS_ADVISOR.ADVISOR_UNLIMITED);
  dbms_advisor.set_task_parameter(taskname,'DML_VOLATILITY','TRUE');
  dbms_advisor.set_task_parameter(taskname,'WORKLOAD_SCOPE','PARTIAL');
  dbms_advisor.set_task_parameter(taskname,'DEF_INDEX_TABLESPACE',DBMS_ADVISOR.ADVISOR_UNUSED);
  dbms_advisor.set_task_parameter(taskname,'DEF_INDEX_OWNER',DBMS_ADVISOR.ADVISOR_UNUSED);
  dbms_advisor.set_task_parameter(taskname,'DEF_MVIEW_TABLESPACE',DBMS_ADVISOR.ADVISOR_UNUSED);
  dbms_advisor.set_task_parameter(taskname,'DEF_MVIEW_OWNER',DBMS_ADVISOR.ADVISOR_UNUSED);
  dbms_advisor.set_task_parameter(taskname,'DEF_MVLOG_TABLESPACE',DBMS_ADVISOR.ADVISOR_UNUSED);
  dbms_advisor.set_task_parameter(taskname,'CREATION_COST','TRUE');
  dbms_advisor.set_task_parameter(taskname,'JOURNALING','4');
  dbms_advisor.set_task_parameter(taskname,'DAYS_TO_EXPIRE','30');

  /* Execute Task */
  dbms_advisor.execute_task(taskname);
END;
/


2.產出建議的Scripts

SET LONG 100000 SET PAGESIZE 50000 SELECT DBMS_ADVISOR.get_task_script('SQLACCESS3638195') AS script 
FROM dual; 
SET PAGESIZE 24

親等計算

處理Oracle 內的日期garbage data

 

在前一家公司的職務是維運的dba
採用golden gate升級移轉10g到18c時
專案負責人有來要求清理garbage data
當時以不是專案scope來回絕
開玩笑....幾億筆的資料
我又不是你單位的人
光做個golden gate implement
我就忙死了,而且手上又不是只有一個專案
答應的話, 我就不用休息睡覺了
現在dedicate在一個政府的系統功能升級標案
雖然說是DBA,不過坦白說9成以上的工作在寫轉檔資料的程式
一定會碰到garbage data
只能處理,避不掉的..........
算分隔符號出現幾次
select REGEXP_COUNT('2003/05/29', '/') from dual
類似Perl 的split , 拆解各elements
select regexp_substr('2003/05-29', '[^/-]+', 1, 1) as grupo_1
,regexp_substr('2003-05/29', '[^/-]+', 1, 2) as grupo_2
,regexp_substr('2003/05/29', '[^/-]+', 1, 3) as grupo_3
from dual;
[^/-]
1.非 / 或 -
2.+ 一或多次出現
驗測是否為數字
case when regexp_like(ur_col, '^\d+(\.\d+)?$')
then 'numeric'
else 'not number'
end





怎麼清掉unicode的空白(0020)
眼前的工作最大的價值
看起來就是在幫客戶清理及整理資料
做起來實在是有夠嘔的.........
SELECT 
CASE WHEN trim(ur_col) = '0' then null else rawtohex(ur_col) end ccc,
length(ur_col) as length,
lengthb(ur_col) as lengthb,
rtrim(ur_col,unistr('\0020')) rtrim_special,
length(rtrim(ur_col,unistr('\0020'))) rtrim_special_length,
lengthb(rtrim(ur_col,unistr('\0020'))) rtrim_special_lengthb
FROM T2



我要截取2012/1/18 上午 12:00:00的後半段
然後再組合存成date
被這些資料給搞死
真是一個資料,各自表述
select regexp_replace('2012/1/18 上午 12:00:00',regexp_substr('2012/1/18 上午 12:00:00', '[^ ]+', 1, 1),'')  from dual;





update town
set name = regexp_replace(name,'臺','台')
where regexp_like(name,'^臺.[縣|市]'); <- 臺開頭,空一個任何字元, 第三個字是縣或市
update county
set name = regexp_replace(name,'臺','台')
where regexp_like(name,'臺');

神奇的Mongodb $elemMatch Operator

 

這是個神奇的東西
既可做查詢條件
也可做為Projection的設定
一開始我其實搞不太清楚它與field.field.field....格式間的差異
看了資料結構後
我才恍然大悟
field.field.field.... 是給只有單一document
elemMatch 是用來找array的內容是document
舉個例子來看,就清楚了
這是relationships欄位的資料結構
它是document array























db.companies.find({ "relationships":
                      { "$elemMatch": { "is_past": true,
                                        "person.first_name": "Mark" } } },
                  { "name": 1 }).pretty()

我們接著來看elemMatch怎麼當作Projection
先瞧瞧scores的資料結構
教材裡的設定
是只顯示超過85分的document
而不是給你所有的scores的資料
db.grades.find({ "class_id": 431 }, { "scores": { "$elemMatch": { "score": { "$gt": 85 } } } }).pretty()

其實Mongodb都把他們的教學影片公開在youtube
我只要註明出處
就不會違反著作權了
更何況我又沒拿來營利....
出處:
https://youtu.be/Vo3SntUloY8
https://youtu.be/8FDWzlkB-oo

碰到Oracle Lock Wait

 

用了10g以上的版本後
最常用的工具就是awr 及addm
以前常用的script都丟掉了
只是最近又幹起了Programmer的工作
你就不太可能像以前幹dba一樣
知道詳細的資料庫連接資料
碰到都是人家已經在工具UI已經弄妥的設定
你只能直接查internal view來解決問題
昨天要refresh整個schema,然後重匯資料
結果有lock,無法清空
臨時間又懶得去翻找以前的東西
感謝Internet
資料隨手可得阿
以前的老dba都雪藏秘珍這種東西啦~~
所以....這些人現在都活不下去了
昨天對我有幫助的是下列這段語法
select
c.owner,
c.object_name,
c.object_type,
b.sid,
b.serial#,
b.status,
b.osuser,
b.machine
from
v$locked_object a ,
v$session b,
dba_objects c
where
b.sid = a.session_id
and
a.object_id = c.object_id;
砍掉該session,就能繼續做事了
出處 :
http://www.dba-oracle.com/t_find_oracle_locked_objects.htm

Mongodb Logic Operator : 到底是我英文爛,還是它描述的糟糕阿...

 

我先寫一下出處
省得被告侵犯著作權
不過
我想它應該也懶得花大錢
就為了這點小事來台灣告我
美國找律師粉貴阿
告我又拿不到什麼錢
這是mongodb的lab問題

出處:
https://university.mongodb.com/mercury/M001/2021_March_16/chapter/Chapter_4_Advanced_CRUD_Operations/lesson/5f36f52104e9ffa9293e896es/problem
沒辦法,上禮拜聽過板橋智財法院的法官的演講
我寫的Query :
db.companies.find({"$and" : [{"founded_year":2005},
{"$or" :[ {category_code:"web"},
                {"founded_month":10}, 
                {category_code:"web"}
             ]
},
{"$or" :[ {category_code:"web"},
                {category_code:"web"}
              ]
}                                               ]
                               }.count()
這是mongodb 給出來的答案
db.companies.find({ "$and": [{ "$or": [
                                                                    { "founded_year": 2004 },
                                                                    { "founded_month": 10 }
                                                                    ]
                                                    },
                                                   { "$or": [
                                                                   { "category_code": "web" },
                                                                   { "category_code": "social" }
                                                                  ]
                                                   }
                                                 ]
                                   }).count()
看了答案後,我傻眼了