2012-08-31

dbms_stats.gather_table_stats ORA-20000: Unable to analyze TABLE, insufficient privileges or does not exist

exec dbms_stats.gather_table_stats('DWH', 'T') begin dbms_stats.gather_table_stats('DWH', 'T'); end; ORA-20000: Unable to analyze TABLE "DWH"."T", insufficient privileges or does not exist ORA-06512: at "SYS.DBMS_STATS", line 13046 ORA-06512: at "SYS.DBMS_STATS", line 13076 ORA-06512: at line 2
Проверьте, что табличное пространство TEMP
1. Существует
2. Ему есть куда расширяться

2012-08-29

Linux: /etc/hosts не используется

Если в домене кривые DNS сервера, а файл /etc/hosts правильно заполнен, но не используется, то надо поменять порядок разрешения. Для этого в файл /etc/host.conf включить строку
# Lookup names in host file and then check DNS order bind,hosts

2012-07-12

Включение аудита подключений

show parameter audit_trail alter system set audit_trail=DB scope=spfile; shut immediate startup audit connect; connect good_user/good_pass connect bad_user/bad_pass connect / as sysdba noaudit connect; select * from sys.aud$

2012-06-19

Клонирование базы при помощи RMAN

1. Завести в tnsnames.ora и listener.ora записи для базы получателя. LISTENER = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME=db2) (ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_1) (SID_NAME=db2) ) ) ADR_BASE_LISTENER = /home/oracle/app/oracle
2. Проверить, что источник находится в archivelog mode и имеется хотя бы один лог
3. Получателя в режим nomount
4.rman nocatalog target sys/pass@db1 auxiliary sys/pass@db2 RUN { SET NEWNAME FOR DATABASE TO '/home/oracle/oradata/db2/%b'; DUPLICATE TARGET DATABASE TO db2 FROM ACTIVE DATABASE LOGFILE GROUP 1 ('/home/oracle/oradata/db2/redo01.log') SIZE 50M REUSE, GROUP 2 ('/home/oracle/oradata/db2/redo02.log') SIZE 50M REUSE; }

2012-04-16

Отличная статья по управлению

Отличная статья по управлению потоками в производстве.

Избранное

Андрей Орлов в «Записках автоматизатора» предложил простое эмпирическое правило: «Если программист стал незаменимым, немедленно увольте его».
Предложение вполне имеет смысл. Незаменимый сотрудник вполне может иметь высочайшую локальную производительность, но его незаменимость слишком сильно дестабилизирует поток.

2012-03-24

Научись быть счастливым

Жизнь слишком коротка, что бы делать только то, что мы должны; ее едва-едва хватает на то, чтобы делать то, что хочется

2012-03-12

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

В статье описано, как при помощи логмайнера найти SQL, который блокирует сессию с подставленными внутрь bind-переменными.

Может быть так же полезна и для изучения Logminer

2012-03-09

Еще немного о .bash_profile

В статье Тима Холла еще немного о файлах .bash_profile, .bashrc. Первый обычно используется для установки переменных, во втором различные алиасы и функции.

2012-02-25

grep and

Реализация поиска нескольких слов командой grep, стырено отсюда:

find /path/to/files/ -print0 |xargs -0 grep -l 'exp 1' |xargs -i{} grep -l 'exp 2' "{}"|xargs -i{} grep -l 'exp 3' "{}"

2012-01-25

Коллекции в SQL

Как в SQL можно работать с коллекциями

1. CARDINALITY(x) = COUNT
2. SET(x) = DISTINCT
3. x MULTISET UNION DISTINCT y = UNION
4. x MULTISET UNION y = UNION ALL
5. x MULTISET UNION ALL y = UNION ALL
6. x MULTISET INTERSECT y = INTERSECT
7. x MULTISET INTERSECT DISTINCT y
8. x MULTISET EXCEPT y = MINUS
9. x MULTISET EXCEPT DISTINCT y

НапримерWITH tax AS (
SELECT 13 a FROM dual UNION ALL
SELECT 35 a FROM dual)
SELECT x MULTISET UNION x
FROM (
SELECT cast(collect(a) AS sps.tpt_number) x, 1 flag FROM tax UNION ALL
SELECT cast(collect(a) AS sps.tpt_number) x, 2 flag FROM tax WHERE ROWNUM > 1
) t
WHERE CARDINALITY(t.x) > 0;


10. POWERMULTISET -- работает как CUBE для коллекций, создает всевозможные наборы из элементов
SELECT *
FROM TABLE(POWERMULTISET(tpt_number(1, 2, 3)));


11. POWERMULTISET_BY_CARDINALITY -- тоже, что и POWERMULTISET, но возвращаются строки с заданным количеством элементов
SELECT *
FROM TABLE(POWERMULTISET_BY_CARDINALITY(tpt_number(1, 2, 3), 2));

2012-01-21

Ошибка ORA-01031 при подключении с сервера

При подключении с сервера строкой sqlplus / as sysdba выдается ошибка:ORA-01031: insufficient privileges

Проверить
1. Пользователь, под которым запускаем SQL*Plus входит в группу DBA для Unix-систем или ORA_DBA для Windows

2. На сервере в файле sqlnet.ora содержится строка SQLNET.AUTHENTICATION_SERVICES= (NTS) для Windows и SQLNET.AUTHENTICATION_SERVICES= (ALL) для Unix

Если такая ошибка выдается при подключении через Listener (т.е. с указанием @имя_базы), то вполне вероятно, что причина в password-файле.

2012-01-17

При ошибке IMP-00058, ORA-1438

При ошибке IMP-00058, ORA-1438 во время импорта
можно прогнать импорт с включенным event="1438 trace name errorstack level 10".

Ошибка чаще всего возникает при разворачивании кластеризованных таблиц или если таблица уже создана с неправильным набором колонок.

2012-01-10

Поиск строки по бинарным файлам

Поиск строки по бинарным файла + простейшее форматирование + убираем дубликаты
$ grep --binary-files=text -o "pkg_social_tax.\([a-z_A-Z]\)*(" *.frf | sed 's/.
*:\(.*\)(/\1/' | sort -u

2011-11-19

Проблемы с Enterprise Manager

На Oracle 10.2.0.4
После создания новой базы в dbca имеем ошибку:

Error securing Database Control, Database Control has been brought up in non-secure mode. To secure the Database Control execute the following command(s):

1) Set the environment variable ORACLE_SID to rsud
2) D:\oracle\product\10.2.0\db_1\bin\emctl.bat stop dbconsole
3) D:\oracle\product\10.2.0\db_1\bin\emctl.bat config emkey -repos -sysman_pwd < Password for SYSMAN user >
4) D:\oracle\product\10.2.0\db_1\bin\emctl.bat secure dbconsole -sysman_pwd < Password for SYSMAN user >
5) D:\oracle\product\10.2.0\db_1\bin\emctl.bat start dbconsole

Как описано в docid 1222603.1 ошибка в устаревшем с 2011 года сертификате. При этом подключение по http работает прекрасно.

Для исправления ошибки выпущен патч 8350262, который обновляет эти сертификаты. После выполнения патча рекомендовано сделать
emctl secure dbconsole -reset

но я почему-то не пошел по этому пути и пересоздал репозитарий полностью:

emca -deconfig dbcontrol db -repos drop
emca -config dbcontrol db -repos create


После выполнения этой штуки получил на экране ошибку (в логе ее нет):

java.io.IOException: The handle is invalidEnterprise Manager configuration compl
eted successfully

at java.io.FileInputStream.close0(Native Method)
at java.io.FileInputStream.close(FileInputStream.java:245)
at sun.nio.cs.StreamDecoder$CharsetSD.implClose(StreamDecoder.java:505)
at sun.nio.cs.StreamDecoder.close(StreamDecoder.java:198)
at java.io.InputStreamReader.close(InputStreamReader.java:187)
at java.io.BufferedReader.close(BufferedReader.java:502)
FINISHED EMCA at 19.11.2011 12:17:53 at oracle.sysman.assistants.util.sqlEngi
ne.SQLEngine$ErrorStreamReader.run(SQLEngine.java:2406)

При этом сервис создался и запустился, https поднялся, но при входе в em видим ошибку:

java.lang.Exception: Exception in sending Request :: null

и переходы на другие вкладки тоже падают с ошибкой:

500 Internal Server Error
java.util.MissingResourceException: Can't find resource for bundle oracle.sysman.db.rsc.LoginResource, key connectStringError
at java.util.ResourceBundle.getObject(ResourceBundle.java:325)


Алгоритм починки этой штуки примерно следующий:
1. Возможно стоит указать JAVA_HOME и PATH на те, которые лежат в ORACLE_HOME (шаг я делал, но он скорее всего лишний)
2. Удаляем все

emca -deconfig all db -repos drop

При удалении пользователя SYSMAN все может повиснуть. Как вариант обхода этого можно перезагрузить базу и удалить пользователя после ее поднятия или погуглить по команде drop user sysman, что даст кучу ссылок по удалению.

3. Очищаем папки, которые находятся в ORACLE_HOME/oc4j/j2ee, которые относятся к старым инсталляциям
4. Создаем все заново (ошибка java.io.IOException почему-то все равно осталась, но все заработало)

emca -cofig all db -repos create


После этого все поднялось и заработало.

Как вариант просто отказаться от https:

emctl unsecure dbconsole

2011-11-04

Weblogic 10.3.0 и не работающий SSL

На неподдерживаемой версии Java 1.6.0_13 и выше ssl на weblogic не поднимается с ошибкой
unsupported oid in the algorithmidentifier object weblogic

Порывшись в гугле, способ решения ошибки такой:

1. Ищем файл с сертификатами от jre: cacerts
2. Выводим в файл все сертификаты keytool -list -v -keystore cacerts -storepass changeit > cacerts.txt
3. Ищем внутри него все сертификаты SHA256withRSA
4. Удаляем сертификаты keytool -delete -keystore cacerts -alias ... -storepass changeit перезапускаем сервер

Примечание: до этого еще удалил сертификаты ttelesecglobalrootclass2ca, ttelesecglobalrootclass3ca

2011-10-21

Удаление пользователей из OIM

Домученный скрипт по удалению удаленных пользователей из OIM. Из замеченных багов -- в отчетах все равно остаются записи об удаленных пользователях, если вместо них создается другой с тем же именем. Вероятно, проще было взять скрипт с forums.oracle.com (если порыться, там можно найти скрипты из нескольких DELETE).

Вполне вероятно в некоторых случаях скрипт работать не будет.

СНЯТЬ БЕКАП ПЕРЕД ЗАПУСКОМ!


set serveroutput on size 1000000

DROP TABLE ref_table;

CREATE TABLE ref_table(
table_name VARCHAR2(30) NOT NULL,
rid rowid NOT NULL PRIMARY KEY,
lvl NUMBER NOT NULL);


DECLARE
lLVL INTEGER := 0;
lROWS_QNT NUMBER;
i PLS_INTEGER;

function build_column_list(aCONSTRAINT_NAME VARCHAR2, aPREFIX VARCHAR2) RETURN VARCHAR2 IS
RESULT VARCHAR2(4000);
BEGIN
FOR rec IN (
SELECT *
FROM user_cons_columns
WHERE constraint_name = aCONSTRAINT_NAME
ORDER BY position
) LOOP
RESULT := RESULT || ',' || aPREFIX || rec.column_name;
END LOOP;
--dbms_output.put_line(LTRIM(RESULT, ','));
RETURN LTRIM(RESULT, ',');
END build_column_list;

FUNCTION process_reference(aLVL NUMBER, aTBL_NAME VARCHAR2, aFK_CONS VARCHAR2, aPAR_TABLE_NAME VARCHAR2, aPK_CONS VARCHAR2) RETURN NUMBER IS
LQNT NUMBER;
BEGIN
dbms_output.put_line('Обработка ссылки на уровне ' || aLVL || ' ' || aTBL_NAME || '.' || aFK_CONS || ' -> ' || aPAR_TABLE_NAME || '.' || aPK_CONS);
IF aTBL_NAME <> aPAR_TABLE_NAME THEN
EXECUTE IMMEDIATE '
UPDATE /*+ NO_INDEX(x)*/ref_table x
SET lvl = (
select max(lvl) + 1
FROM ' || aPAR_TABLE_NAME || ' pt, ref_table rt
WHERE rt.rid = pt.rowid
AND ( ' || build_column_list(aPK_CONS, 'pt.') || ') IN (SELECT ' || build_column_list(aFK_CONS, 't.') || ' FROM ' || aTBL_NAME || ' t)
)
WHERE (rid || '' '') IN (
SELECT /*+ NO_INDEX(t)*/ t.rowid || '' ''
FROM ' || aTBL_NAME || ' t
WHERE ( ' || build_column_list(aFK_CONS, 't.') || ')
IN (SELECT ' || build_column_list(aPK_CONS, 'pt.') || ' FROM ref_table rt, ' || aPAR_TABLE_NAME || ' pt WHERE rt.rid = pt.rowid))';
END IF;

dbms_output.put_line('Обновлено уровней: ' || SQL%ROWCOUNT);
EXECUTE IMMEDIATE '
INSERT INTO ref_table(table_name, rid, lvl)
SELECT ''' || UPPER(aTBL_NAME) || ''', t.rowid, :LVL + 1
FROM ' || aTBL_NAME || ' t
WHERE ( ' || build_column_list(aFK_CONS, 't.') || ')
IN (SELECT ' || build_column_list(aPK_CONS, 'pt.') || ' FROM ref_table rt, ' || aPAR_TABLE_NAME || ' pt WHERE rt.rid = pt.rowid)
AND NOT EXISTS (
SELECT NULL
FROM ref_table rt
WHERE rid = t.rowid)'
USING aLVL;
lQNT := SQL%ROWCOUNT;
dbms_output.put_line('Добавлено строк ' || lQNT);

RETURN lQNT;
END;

FUNCTION process_level(aLVL NUMBER) RETURN NUMBER IS
lQNT NUMBER := 0;
BEGIN
dbms_output.put_line('+++ level = ' || aLVL);
FOR rec IN (
SELECT DISTINCT f.table_name chi_table_name, f.constraint_name chi_table_cons,
pp.table_name par_table_name, pp.constraint_name par_table_cons
FROM user_constraints f, user_constraints pp
WHERE f.constraint_type = 'R'
AND f.r_constraint_name = pp.constraint_name
AND pp.table_name IN (SELECT upper(table_name) FROM ref_table WHERE lvl = aLVL)
) LOOP
lQNT := lQNT + process_reference(aLVL, rec.chi_table_name, rec.chi_table_cons, rec.par_table_name, rec.par_table_cons);
END LOOP;
RETURN lQNT;
END;
BEGIN
INSERT INTO ref_table(table_name, rid, lvl)
SELECT 'USR', u.rowid, 0
FROM usr u
WHERE u.usr_status = 'Deleted';

lROWS_QNT := process_level(lLVL);
dbms_output.put_line('Будет удалено на уровне ' || (lLVL + 1) || ' ' || lROWS_QNT || ' строк');
WHILE lROWS_QNT > 0 LOOP
lLVL := lLVL + 1;
lROWS_QNT := process_level(lLVL);
dbms_output.put_line('Будет удалено на уровне ' || (lLVL + 1) || ' ' || lROWS_QNT || ' строк');
END LOOP;

dbms_output.put_line('=========');
dbms_output.put_line('Удаление');
dbms_output.put_line('=========');

-- Удаляем
FOR rec IN (
SELECT DISTINCT table_name, lvl
FROM ref_table
ORDER BY lvl DESC
) LOOP
dbms_output.put_line('Удаляем записи из ' || rec.table_name || ' lvl = ' || rec.lvl);
EXECUTE IMMEDIATE '
delete from ' || rec.table_name || ' t
where t.rowid IN (SELECT rid FROM ref_table WHERE table_name = :TN AND lvl = :lvl)'
USING rec.table_name, rec.lvl;

dbms_output.put_line('Из таблицы ' || rec.table_name || ' удалено строк ' || SQL%ROWCOUNT);
END LOOP;
END;
/

2011-06-07

Шаблон расположения регионов в APEX

Для того, что бы посмотреть, где расположить регион на странице (display point), можно открыть любой регион, найти поле Display Point и нажать на фонарик рядом с полем