Търси сe: Oracle DBA

 Общи  Коментарите са изключени за Търси сe: Oracle DBA
фев. 122013
 

Търсим свежо попълнение за DBA екипа в Skrill – екипа, в който работя от 3 години. Обявата с повечко подробности е пусната в Jobs.bg. Прекрасно осъзнавам, че не можем да намерим универсален войник, който да знае всичко; за това по-редките „дарби“ сме ги изписали като appreciated. Като цяло всеки, който има солиден опит с управление на любимата ми БД, е добре дошъл (в смисъл, да изпрати CV).

Склонен съм да отговоря на някой по-общи въпроси и тук, но подмятания от типа на „колко пари горе-долу давате“ или „каква е паролата за sys на вашите бази“ няма да минат 🙂

Ако се чудите дали си заслужава, помислете над следното – в България има към 7 милиона жители. Колко клиента има най-голямата финансова институция? Нашите са над 33 милиона…

 Posted by at 13:24

Новата реколта

 Общи  Коментарите са изключени за Новата реколта
ян. 092013
 

В момента зреят – да, навън.

На студа.

Някои са прави, други – на подкови:

sudjuk

Надявам се до края на месеца да са готови. А за догодина мисля да сглобя по-голям сушилник. Че така като са наблъскани съхнат бавно.
Като си го проектирах този, не съм предполагал колко много хубави неща могат да се „случват“ вътре…

sudjuk2

 Posted by at 20:26
ян. 022013
 

pastyrtma2Пастърмицата се получи. Сега ще споделя рецептата, докато не съм я забравил. Че в момента сушилника е зает с нещо друго, с което ще се похваля по-късно.

Месото, което взех, беше свинско филе и телешки вайсбрат. Може и от други меса (вкл. сърца), но трябва да се чистят от мазнини и жили. За това взех най-чистото месце – от мързел.

Наредих го в една тенджера с морска сол (на кристали): ред сол, ред месо, ред сол и т.н. Стоя малко по-малко от три денонощия. Тук трябва да отбележа, че според рецептата (благодаря ти, Том), ако използвате обикновен готварска сол, ден-два стигат. С морската трябват два-три дни. Според мен се получи малко по-соленичко от идеалното, но другите казват, че е добре. То аз си обичам по-безсолните неща. Но солта е важна за изтребването на разни бактерии, които могат да заживеят в месото.

Следващата операция беше пет-шест часа изкисване в студена вода. Може да опитате суровото месо на вкус – не трябва да е пресолено. Имайте предвид, че при последващото изсушаване водата заминава, а солта остава.

pastyrtma5След това притиснах парчетата между две големи тави, с възможно най-голямата тежест, която успях да закрепя отгоре. Там стояха 24 часа, леко наклонени, да се отцедят и да придобият форма. След това ги овалях в следната богоугодна смес:
– 8 части червен пипер
– 4 части чубрица
– 2 части чимен на прах
– 1 част черен пипер
– 1 част чесън на гранули
– 1/2 част кимион
Количеството зависи от размера на мръвките. На мен ми хартиса доста, но си го запазих в бурканче за следващия път. Важно е да не пропускате чимена (малко трудно се намира). Чимена е сърцето на пастърмата. А има и антисептично действие.

След това започна чакането. По принцип две седмици трябва да са достатъчно, но това зависи от сушилника и времето. Понеже времето в София беше доста мъгливо, времето не стигна и след Коледа го досушавах.

Крайният резултат е напълно задоволителен. Добър апетит!

pastyrtma8

 

 Posted by at 20:34

Честита нова година

 Общи  Коментарите са изключени за Честита нова година
дек. 312012
 

Съвсем очаквано GSM мрежата в малкото градче клекна. Приятна изненада е, че все пак данните през 3G си минават без проблеми 🙂

Желая на всички много успешна и усмихната. Дайте тази година да се вземем в ръце и да си оправим държавицата. Всеки като прави по нещо малко всеки ден – ще се получи. Сигурен съм.

 Posted by at 22:36

Хобит: неочаквано пътешествие

 Общи  Коментарите са изключени за Хобит: неочаквано пътешествие
дек. 312012
 

Не мога да го разбера тоя Питър Джаксън. Професор Джон Роналд Руел Толкин е всепризнат разказвач, един от най-великите във фентъзито (според много хора си е направо най-великият). Тоя Джаксън явно има потресаващо самочувствие – мисли, че може да разказва по-добре. Едно е да адаптираш книга за екрана. Ама да си измисляш разни случки, вмъкнати ни в клин, ни в ръкав… Кръпките към сюжета дразнят с безвкусния си напън да направят приказката на екшън.

Както и да е. Филма става, не съжалявам, че го гледах. Е, бих предпочел да се насладя на нормална 2D версия, че два часа и половина с тези ултра неудобни очила ми дойдоха малко вповече. Но ако оставим това настрана, филма е доста красив. Много добре направен. Искрено го препоръчвам на всеки. Дори и на феновете на книгата – все пак си струва. А за тези, които не са чели „Хобит“, ще бъде една прекрасно изживяване, една наслада за душата.

А аз с умерен ужас очаквам да видя какви съчинени любовни истрории и напомпани екшън елементи ще зашие с бели конци Питър Джаксън към следващата част.

 Posted by at 14:25

Изпуши ми главата!

 Общи  Коментарите са изключени за Изпуши ми главата!
дек. 112012
 

Нова мода имало из заведенията – раздавали одеяла на пушачите. Да се предпазят от настинка докато се мъчат да хванат рак на белия дроб. Каква ирония…

 Posted by at 6:54
дек. 102012
 

Студ.

Мраз.

Тъмнина.

Тя стои навън. И ден, и нощ. Вече два дни – и поне още седмица.

Тя:

Няма мащаб в тази снимка. Най-голямото парче е към 18-20 см. А това, което не мога нито да снимам, нито да опиша, е аромата…

На преден план са телешките, а зад тях са свинските. До Коледа трябва да са готови 🙂

 Posted by at 19:54

EM Event: Critical:ORADB – Row(3): Supplied date is in the future

 Общи  Коментарите са изключени за EM Event: Critical:ORADB – Row(3): Supplied date is in the future
окт. 282012
 

Да ни е честит на всички този гаден гнусен бъг. С преминаването към зимно часово време OEM 12c Cloud control започна да бълва стотици нотификации от рода на:

EM Event: Critical:ORADB – Row(3): Supplied date is in the future : now = Sun Oct 28 03:34:22 CET 2012 supplied value = Sun Oct 28 04:34:00 CET 2012

Или още по-гнусното

EM Event: Critical:ORADB – Row(1): Supplied date is in the future : now = Sun Oct 28 02:55:23 CEST 2012 supplied value = Sun Oct 28 02:55:20 CET 2012

Разбира се, в My Oracle Support не пише нищо по въпроса. Единственото подобно нещо е Bug 14258529, но той не е оправен.

За сега закърпих положението с рестарт на агентите. Изглежда, че се оправи – вече 15 минути няма такива нотификации. Ще ходя да си доспивам…

 Posted by at 2:53

Много бази – хилав сървър

 Общи  Коментарите са изключени за Много бази – хилав сървър
окт. 142012
 

Добре, де. Сървъра не е хилав. Обаче не е и някакво чудо неземно. Все пак е Dev сървър, на него търкаляме Dev бази.

Проблемът е, че търкаляме 30 Dev бази на един сървър. Вярно, във всеки един момент активно работят само 5-6 от тях (или 1-2). Но не и като дойде време за събиране на статистики. Настъпи ли време за събиране на статистики… жална му майка на сървъра. Всичките 30 бази почват да въртят дисковете – въртят, сумтят… и дисковете клякат. ASM също кляка и понякога дори спира да respond-ва за няколко секунди. В екстремните случаи се случва няколко бази да загинат:

ORA-15064: communication failure with ASM instance
ORA-03113: end-of-file on communication channel
Process ID:
Session ID: 4 Serial number: 1
ASMB (ospid: 8290): terminating the instance due to error 15064

Тук е времето да уточня, че тези 30 бази се създават като копия на една „master“ база. Каквото има на нея – такова има на тях. Всеки developer или екип може да си пресъздаде базата като текущо копие на master базата, или, много по-рядко, като копие на базата на другарчето си. Така че ако на master базата пише статистиките да тръгнат в 22:00 часа, рано или късно всички други бази ще започнат да си събират статистики в 22:00. И това, всъщност, е най-най-тежкото нещо, което може да се случи на този сървър.

Ето и решението, което съчиних:

create or replace procedure p_scramble_stats_start as
  v_start_hour char(1);
  v_start_min char(2);
BEGIN
  -- disable
  DBMS_SCHEDULER.DISABLE(name => '"SYS"."MONDAY_WINDOW"', force => TRUE);
  DBMS_SCHEDULER.DISABLE(name => '"SYS"."TUESDAY_WINDOW"', force => TRUE);
  DBMS_SCHEDULER.DISABLE(name => '"SYS"."WEDNESDAY_WINDOW"', force => TRUE);
  DBMS_SCHEDULER.DISABLE(name => '"SYS"."THURSDAY_WINDOW"', force => TRUE);
  DBMS_SCHEDULER.DISABLE(name => '"SYS"."FRIDAY_WINDOW"', force => TRUE);
  DBMS_SCHEDULER.DISABLE(name => '"SYS"."SATURDAY_WINDOW"', force => TRUE);
  DBMS_SCHEDULER.DISABLE(name => '"SYS"."SUNDAY_WINDOW"', force => TRUE);
  -- "choose" the time
  select to_char(ora_hash(instance_name, 6)), to_char(ora_hash(instance_name, 59))
    into v_start_hour, v_start_min
    from v$instance;
  -- set
  DBMS_SCHEDULER.SET_ATTRIBUTE(name      => '"SYS"."MONDAY_WINDOW"',
                               attribute => 'REPEAT_INTERVAL',
                               value     => 'freq=daily;byday=MON;byhour='||v_start_hour||';byminute='||v_start_min||';bysecond=0');
  DBMS_SCHEDULER.SET_ATTRIBUTE(name      => '"SYS"."TUESDAY_WINDOW"',
                               attribute => 'REPEAT_INTERVAL',
                               value     => 'freq=daily;byday=TUE;byhour='||v_start_hour||';byminute='||v_start_min||';bysecond=0');
  DBMS_SCHEDULER.SET_ATTRIBUTE(name      => '"SYS"."WEDNESDAY_WINDOW"',
                               attribute => 'REPEAT_INTERVAL',
                               value     => 'freq=daily;byday=WED;byhour='||v_start_hour||';byminute='||v_start_min||';bysecond=0');
  DBMS_SCHEDULER.SET_ATTRIBUTE(name      => '"SYS"."THURSDAY_WINDOW"',
                               attribute => 'REPEAT_INTERVAL',
                               value     => 'freq=daily;byday=THU;byhour='||v_start_hour||';byminute='||v_start_min||';bysecond=0');
  DBMS_SCHEDULER.SET_ATTRIBUTE(name      => '"SYS"."FRIDAY_WINDOW"',
                               attribute => 'REPEAT_INTERVAL',
                               value     => 'freq=daily;byday=FRI;byhour='||v_start_hour||';byminute='||v_start_min||';bysecond=0');
  DBMS_SCHEDULER.SET_ATTRIBUTE(name      => '"SYS"."SATURDAY_WINDOW"',
                               attribute => 'REPEAT_INTERVAL',
                               value     => 'freq=daily;byday=SAT;byhour='||v_start_hour||';byminute='||v_start_min||';bysecond=0');
  DBMS_SCHEDULER.SET_ATTRIBUTE(name      => '"SYS"."SUNDAY_WINDOW"',
                               attribute => 'REPEAT_INTERVAL',
                               value     => 'freq=daily;byday=SUN;byhour='||v_start_hour||';byminute='||v_start_min||';bysecond=0');
  -- enable
  DBMS_SCHEDULER.ENABLE(name => '"SYS"."MONDAY_WINDOW"');
  DBMS_SCHEDULER.ENABLE(name => '"SYS"."TUESDAY_WINDOW"');
  DBMS_SCHEDULER.ENABLE(name => '"SYS"."WEDNESDAY_WINDOW"');
  DBMS_SCHEDULER.ENABLE(name => '"SYS"."THURSDAY_WINDOW"');
  DBMS_SCHEDULER.ENABLE(name => '"SYS"."FRIDAY_WINDOW"');
  DBMS_SCHEDULER.ENABLE(name => '"SYS"."SATURDAY_WINDOW"');
  DBMS_SCHEDULER.ENABLE(name => '"SYS"."SUNDAY_WINDOW"');
END;

Тази процедура си избира произволен час и минута (от 00:00 до 6:59) на база името на инстанса. След това сетва всичките maintenance прозорци (в които се събират статистики) да се отварят в този час. В нашия случай събирането продължава от 5 до 15 минути на база, така че не е проблем.

Направих на всички бази един job, който всяка вечер в 22:00 да изпълнява тази процедура. Така който и да копира от master или от някой друг, ще бъде фикснат най-късно на следващата вечер.

И от тогава не сме имали такива проблеми.

 Posted by at 9:23

Manual SQL tunning task

 Общи  Коментарите са изключени за Manual SQL tunning task
окт. 132012
 

Тествано на 11.2.0.2

SQL tunning advisor е страшна далавера. Е, изисква допълнителен лиценз за tunning pack, но върши работа, която за обикновен човек е практически невъзможна.

По-честият вариант е когато нещо се скапе в production и трябва спешно да се оправи. Ех, колко пъти ни е спасявал SQL tunning advisor в такива ситуации… Хем намира решение (без да ти се налага да разбираш какво, аджеба, прави тази заявка); хем прави профил – така не се налага промяна в кода на самото приложение. Аз лично не съм се и опитвал ръчно да правя профил, супер пипкава работа ми изглежда. Правил съм ръчно outline и това беше пипкаво.

Има, обаче, и един друг сценарий. Представете си един горд developer, който е сътворил заявка с 97 реда execution plan. И моли за съдействие при оптимизацията. Това нещо е извън възможностите за възприемане. А SQL tunning advisor минава за минути и в повечето случаи наистина дава добри идеи. Как да го пуснеш, обаче?

През Grid/Cloud control е лесно – цъкаш, цъкаш и става. Но какво парим, ако го няма Could control закачен към базата? Или ако просто искаме да видим някой съвет за едно query, което ни мъчи?

Всъщност става много лесно:

1. Създаване на таск:

DECLARE
  v_task VARCHAR2(30);
  v_sql  CLOB;
BEGIN
  v_sql     := 'SELECT ... FROM ... WHERE ...';
  v_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_text => v_sql, 
                                               user_name => 'HR', 
                                               scope => 'COMPREHENSIVE',
                                               time_limit => 3600, -- seconds
                                               task_name => 'tune_test2',
                                               description => 'Tune statement used for the new XYZ functionality.');
END;
/

2. Изпълнение. Това може да отнеме доста време, в зависимост от сложността на заявката и зададения лимит:

exec dbms_sqltune.execute_tuning_task(task_name => 'tune_test2');

3. Да видим резултата. Това е целта, всъщност

set long 90000 longchunksize 90000
set linesize 232 pagesize 9999
select dbms_sqltune.report_tuning_task('tune_test2') from dual;

DBMS_SQLTUNE.REPORT_TUNING_TASK('TUNE_TEST2')
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
Tuning Task Name   : tune_test2
Tuning Task Owner  : HR
Workload Type      : Single SQL Statement
Scope              : COMPREHENSIVE
Time Limit(seconds): 3600
Completion Status  : COMPLETED
Started at         : 10/05/2012 12:07:10
Completed at       : 10/05/2012 12:12:13

-------------------------------------------------------------------------------
Schema Name: HR
SQL ID     : ba6g55fakh01v
SQL Text   : SELECT ...

-------------------------------------------------------------------------------
FINDINGS SECTION (1 finding)
-------------------------------------------------------------------------------

1- SQL Profile Finding (see explain plans section below)
--------------------------------------------------------
  A potentially better execution plan was found for this statement.

  Recommendation (estimated benefit: 76.48%)
  ------------------------------------------
  - Consider accepting the recommended SQL profile.
    execute dbms_sqltune.accept_sql_profile(task_name => 'tune_test2',
            task_owner => 'HR', replace => TRUE);

-------------------------------------------------------------------------------
EXPLAIN PLANS SECTION
-------------------------------------------------------------------------------

1- Original With Adjusted Cost
------------------------------
Plan hash value: 2801951464

------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                | Name                        | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                         |                             |    21 |  1302 | 30711   (4)| 00:06:09 |
...
|  97 |    TABLE ACCESS FULL                     | MY_TAB                      |     2 |    10 |     2   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
...
  95 - access("E"."TEST_ID"="T"."TEST_ID")

2- Original With Adjusted Cost
------------------------------

-------------------------------------------------------------------------------
Error: cannot fetch explain plan for object: 1
-------------------------------------------------------------------------------

3- Using SQL Profile
--------------------
Plan hash value: 3439552619

------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                | Name                        | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                         |                             |    21 |  1302 |  7223   (2)| 00:01:27 |
....
|  97 |    TABLE ACCESS FULL                     | MY_TAB                      |     2 |    10 |     2   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
....
  95 - access("E"."TEST_ID"="T"."TEST_ID")

(Да, наистина го пусках това за заявка с 97 стъпки в плана и 95 филтъра. Естествено тук съм отрязал както заявката, така и плановете и предикатите )

4. Може и да приложим предложения план. Аз в случая исках само да видя съвета, но пък за да се измери реалната промяна, трябва да се тества наистина с пускане на заявката

execute dbms_sqltune.accept_sql_profile(task_name => 'tune_test2',  task_owner => 'HR', replace => TRUE);
 Posted by at 11:40