Раздел, посвященный Oracle и ТС Супермаг 2000

03.03.06 Задуман этот раздел для обобщения каких-то сведений, а так же сбора FAQ по этим двум системам в их связи. Задуман, собственно, давно, но пока выдалась минута свободного времени, пожертвую ее в фонд спасения своего времени в дальнейшем.
Обращаю Ваше внимание, что есть форум, посвященный Супермаг, УКМ, Oracle и программированию. Форум OlegON
Перепечатка и любое другое использование материалов без указания ссылки на мой сайт категорически запрещаются.

Вопрос:
при удалении приходной накладной появляется ошибка:
ORA-02292: нарушено ограничение целостности
(SUPERMAG.SMCSPECCAUSE) - обнаружена порожденная запись
ORA-06512: на "SUPERMAG.DOCUMENTS", line 6787
ORA-06512: на "SUPERMAG.SMDOCDELETEWI", line 4
ORA-06512: на line 1
Ответ:
Порожденная запись в SMCSPECCAUSE, как правило, признак того, что этот удаляемый документ уже кем-то добавлен в основания документа. Для исправления необходимо через Функции найти этот связанный документ и исправить или удалить его.
Вопрос:
у меня база тормозит, что делать?
Ответ:
Начните с определения, что именно у Вас тормозит. В Windows есть удобные средства для диагностики, тот же PerfMon, да и просто открыть Task Manager, посмотреть... Не забывайте просматривать alert*.log самого Oracle. Как правило, проблема заключается в давно нерасчитываемой статистике оптимизатора, либо в убитом индексе. С этим и многим остальным можно справиться с помощью Optimizer, который лежит на этой же странице в программах. Обращаю внимание, что нехватка свободного места при расширении табличного пространства может привести ко многим нежелательным последствиям, поэтому не стоит дожидаться критических моментов. Если уж все плохо и ничего не получается и решили обратиться в поддержку, не забывайте прикреплять alert*.log, не за весь период, а за последние дня 2-3.
Вопрос:
Не получается залить кассовую смену в Супермаг 2000
ORA-02290: нарушено ограничение целостности
CHECK(SUPERMAG.SMDOCDISCCARDSPEC_SUM)
ORA-06512: на "SUPERMAG.CASH", line 1416
ORA-06512: на "SUPERMAG.CASH", line 1458
ORA-06512: на "SUPERMAG.CASH", line 1494
ORA-06512: на line 2
Ответ:
Такое случается при работе со старыми версиями УКМ. Известна ошибка при которой, если вернуть товар по чеку, на который была применена скидка, то сумма скидки так же пыталась "вернуться" и становилась отрицательной. Супермаг этого не терпит.
Вопрос:
При работе с Супермагом часто выскакивает ORA-00600, что это и как бороться?
Ответ:
Основные причины следующие: 1) Закручены и "заоптимизированы" параметры базы, проверьте их Оптимайзером 2) Не установлены патчи на Oracle, необходимо их доустановить. Причем в этом случае я бы порекомендовал импорт и экспорт базы с ее пересозданием (можно сделать через Редактор) 3) Физическое повреждение базы (будет обнаружено Оптимайзером, либо утилитой Oracle dbv.exe), в этом случае рекомендуется базу немедленно пересоздать и проверить носители.
Вопрос:
При создании кассовых документов (аналогичная ошибка может проявляться при сохранении других типов документов)
ORA-00001: нарушено ограничение уникальности (SUPERMAG.SMCSPECTAX_PK)
ORA-06512: на "SUPERMAG.CASH", line 1416
ORA-06512: на "SUPERMAG.CASH", line 1458
ORA-06512: на "SUPERMAG.DOC3", line 1255
ORA-06512: на "SUPERMAG.SMDOCCREATECS", line 6
ORA-06512: на line 1
Ответ:
Проверьте структуру налогов в Административном модуле, скорее всего проблема именно в этом.
Вопрос:
Потеряны старые контрольные файлы control01.ctl и т.п. или повреждены
Ответ:
Если Вы хорошо знаете структуру базы, Вы можете пересоздать их.
Удалить (перенести в другой каталог) старые управляющие (control) файлы. И примерная последовательность команд на создание контрольника:
STARTUP NOMOUNT;
CREATE CONTROLFILE SET DATABASE "dbsy" RESETLOGS NOARCHIVELOG MAXLOGFILES 32 MAXLOGMEMBERS 2 MAXDATAFILES 254 MAXINSTANCES 1 MAXLOGHISTORY 226
LOGFILE GROUP 1 'C:\oracle\816\oradata\dbsy\REDO01.LOG' SIZE 5000K, GROUP 2 'C:\oracle\816\oradata\dbsy\REDO02.LOG' SIZE 5000K, GROUP 3 'C:\oracle\816\oradata\dbsy\REDO03.LOG' SIZE 5000K
DATAFILE 'C:\oracle\816\oradata\dbsy\SYSTEM01.DBF', 'C:\oracle\816\oradata\dbsy\RBS01.DBF', 'C:\oracle\816\oradata\dbsy\USERS01.DBF', 'C:\oracle\816\oradata\dbsy\TEMP01.DBF', 'C:\oracle\816\oradata\dbsy\TOOLS01.DBF', 'C:\oracle\816\oradata\dbsy\INDX01.DBF'
CHARACTER SET CL8MSWIN1251;
ALTER DATABASE OPEN RESETLOGS;
Вопрос:
Как пользоваться утилитой dbv.exe
Ответ:
Это утилита DBVERIFY. Позволяет проверить целостность файлов базы (структуры), в т.ч. находящейся в offline.
Пример использования:
dbv file=USERS01.DBF blocksize=4096
Вопрос:
Как ускорить время подключения клиента?
Ответ:
Во-первых, обратите внимание, не установлены ли дополнительные протоколы, кроме TCP/IP. Во-вторых можно предложить предварительный запуск серверных процессов. Вы можете указать listener-у запустить несколько пустых серверных процессов. В этом случае при обработке запроса на соединение не надо будет запускать серверный процесс; просто будет использоваться один из свободных. Данное поведение задается в файле LISTENER.ORA в секции SID_LIST_LISTENER следующем образом:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = yourSID)
(PRESPAWN_MAX = 50)
(PRESPAWN_LIST =
(PRESPAWN_DESC = (PROTOCOL = TCP) (POOL_SIZE = 5)
(TIMEOUT = 2))))
)
PRESPAWN_MAX: если уже установлено 50 соединений к базе данных, то listener не будет предварительно запускать процессы.
POOL_SIZE: listener будет поддерживать 5 свободных процессов.
TIMEOUT: после отсоединения клиента listener будет держать свободным соединение две минуты, ожидая новое соединение, перед тем как убить процесс.
Вопрос:
Хочу взаимозаменяемости серверов!
Ответ:
Вы можете указать насколько адресов для одной точки входа в файле TNSNAMES.ORA. Это будет означать, что вы сможете соединиться с базой данных, даже если несколько компьютеров выйдет из строя. Взгляните на следующий пример:
oradb1 = (DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(COMMUNITY = TCP_COMM)
(PROTOCOL = TCP)
(HOST = Machine01))
(ADDRESS =
(COMMUNITY = TCP_COMM)
(PROTOCOL = TCP)
(HOST = Machine02)))
(CONNECT_DATA=(
(SID=oradb1))))
Предположим, что компьютер Machine01 выключен, тогда новый запрос на соединение по имени oradb1 будет автоматически отправляться на Machine02. Но есть одно ограничение, SID на обоих машинах должен быть одним и тем же. Данный способ может обеспечит гарантированное соединение с серверов приложений и с Oracle Parallel Server.
Вопрос:
Говорите не рекомендуется ставить брэндмауэр? А как разграничить доступ? Можно ли ограничить доступ к системе через SQL*Net?
Ответ:
Да, создайте файл protocol.ora и укажите в нем:
tcp.validnode_checking = yes
tcp.invited_nodes = (olegon.ru,77.37.184.187)
tcp.excluded_nodes = (,77.37.184.187)
Вопрос:
Часто ругается на номер табличного пространства, как узнать имя по номеру?
Ответ:
SELECT TS#, NAME FROM SYS.TS$;
Вопрос:
База падает с непонятными ошибками, что делать?
Ответ:
В первую очередь заглянуть в каталог, назначенный параметром background_dump_dest. В нем наверняка есть файл с именем вроде alert*.log. Найдите и проанализируйте данные за последний день. Для более глубокого анализа можно воспользоваться утилитой tkprof, которая позволяет анализировать дампы user_dump_dest
Вопрос:
В трассировках часто пишутся аббревиатуры подсистем Oracle, как их расшифровать?
Ответ:
Подсистемы ядра Oracle (указываются, например, в трассировках)
OPI Oracle Program Interface
KK Compilation Layer - Parse SQL, compile PL/SQL
KX Execution Layer - Bind and execute SQL and PL/SQL
K2 Distributed Execution Layer - 2PC handling
NPI Network Program Interface
KZ Security Layer - Validate privs
KQ Query Layer
RPI Recursive Program Interface
KA Access Layer
KD Data Layer
KT Transaction Layer
KC Cache Layer
KS Services Layer
KJ Lock Manager Layer
KG Generic Layer
S или ODS Operating System Dependencies
Вопрос:
Как отобрать строки по дате?
Ответ:
Чтобы не мучиться с региональными настройками и т.п., можно использовать условие where DATE_COL < TO_DATE('20.01.2006','DD.MM.YYYY')
Вопрос:
Можно ли получить I/O статистику по таблице?
Ответ:
Отчет UTLESTAT показывает I/O по tablespace-ам, но из него нельзя узнать какая из таблиц дает наибольший вклад в I/O tablespace-а. Для получения статистики по конкретному объекту, исполните скрипт $ORACLE_HOME/rdbms/admin/catio.sql. В нем будет создана процедура sample_io и таблица для сбора желаемой информации. После запуска процедуры можно исполнить SELECT * FROM io_per_object; для получения информации. Для получения более подробной информации обратитесь к комментариям скрипта $ORACLE_HOME/rdbms/admin/catio.sql script.
Вопрос:
У меня поврежден REDO, что делать?
Ответ:
Следующий параметр файла INIT.ORA можно использовать, если были потеряны или испорчены redologs. Использовать этот параметр надо осторожно, т.к. Вы можете полностью потерять все данные!!! _allow_resetlogs_corruption = true , сразу после этого лучше сделать экспорт-импорт базы. В большинстве же случаев REDO оказывается текущим и остается искать бэкап.
Вопрос:
При потере Rollback Segments, как восстановить базу данных?
Ответ:
Если один из Ваших rollback segments поврежден, перезапустите базу данных со следующим параметром файла INIT.ORA. Затем Вы сможете удалить поврежденные rollback segments и создать новые. Эти действия также надо делать осторожно, т.к. в результате незаконченные транзакции могут быть помечены как законченные (и Вы потеряете данные или даже могут получаться несогласованные данные)!!!
_corrupted_rollback_segments = (rbs01,rbs01,rbs03,rbs04). Так же, как в случае с REDO лучше сразу пересоздать базу.
Вопрос:
Как экспортировать данные в текстовый файл?
Ответ:
Во-первых, в Редакторе есть целая куча вариантов экспорта данных, не только в текст, но и в Excel и другие форматы, во-вторых можно самое простое сделать с помощью SQL Plus
set echo off newpage 0 space 0 pagesize 0 feed off head off trimspool on
spool oradata.txt
select col1 || ',' || col2 || ',' || col3
from tab1
where col2 = 'XYZ';
spool off
Вопрос:
Часто выдает ошибку, что блок данных поврежден. Вы рекомендуете перестроить объект. А как узнать, какой именно?
Ответ:
SELECT SEGMENT_TYPE,OWNER||'.'||SEGMENT_NAME FROM DBA_EXTENTS
WHERE номер файла = FILE_ID AND номер блока BETWEEN BLOCK_ID AND BLOCK_ID+BLOCKS-1;
Вопрос:
Выскакивает сообщение Access denied (Доступ запрещен), когда пытаюсь открыть Сервер Супермага, Почтовый сервер или Кассовый сервер. Что делать?
Ответ:
Прежде всего приучиться читать документацию. В руководстве администратора описана процедура настройки dcomcnfg. Можно использовать Default Security, чтобы не мучиться при каждой переустановке, можно ускорить процесс настройки следующим (цитирую написанное мной служебное письмо): Как известно, при установке СМ2000, а так же в некоторых случаях при его переустановке и накатывании SP, требуется запускать dcomcnfg, чтобы раздать права на COM+ сервера СМ2000, кассового, почтового... Занудно, но при определенных навыках и терпении можно делать. Но в один прекрасный момент у меня dcomcnfg перестал запускаться. И выяснилось следующее: достаточно прописать параметр AuthenticationLevel типа DWORD, равный 1, в ключе HKEY_CLASSES_ROOT\AppID\{4a2fdac0-38cc-11d2-bfec-0080adb82b82}, как Сервер Супермага перестает приставать с Access Denied.
Тоже самое можно сделать с почтовым сервером и кассовым, они легко находятся по AppID
HKEY_CLASSES_ROOT\AppID\{37013916-AFA8-4d36-967C-B287EF1A7E5D} для почтовика
HKEY_CLASSES_ROOT\AppID\{9B40D405-4F41-4e96-A00D-3475C5719E33} для кассового
HKEY_CLASSES_ROOT\AppID\{C0688258-7C30-43b6-9679-40A626B04D8B} для модуля контроля цен
Кстати, о программном способе решения этой же проблемы написано здесь http://www.rsdn.ru/article/com/comsec.xml#XSLTSECTION182143120120, я бы сделал, но CoInitializeSecurity в Delphi 7 не описана, а самому возиться некогда.
Набор готовых reg-файлов можно скачать тут
Вопрос:
В руководстве сисадмина есть глава Реорганизация БД. Там упоминаются скрипты TblMove, LobMov, IdxMove, NewQuota, NewDefault, dxRepair, где их взять?
Ответ:
Документация устарела, кроме того, упоминание об этих скриптах было внесено в документацию ошибочно. Все необходимые операции выполняются через интерфейс Оптимайзера.
Вопрос:
Что означает «товар с неустановленной себестоимостью», откуда берется этот товар, и как программа проставляет в отчетах его себестоимость?
Ответ:
Исчерпывающая информация на эту тему содержится в справке к отчету "Детализация неустановленной себестоимости". Особо рекомендую обратить внимание на ссылку "расчет себестоимости".
Вопрос:
ORA-20050: Ошибка при записи в журнал операций над документами
ORA-06512: на "SUPERMAG.CORE", line 262
ORA-06512: на "SUPERMAG.DOCUMENTS", line 59
ORA-01653: невозможно увеличить таблицу SUPERMAG.SMDOCLOG до
64 в разделе USERS
ORA-06512: на "SUPERMAG.SMPOSTENDUPDATEDOC", line 64
ORA-06512: на line 1
Ответ:
Самое простое - скорее всего закончилось место в базе. Добавьте его в табличное пространство. Второй вариант - попробуйте увеличить NEXT-экстент на этом табличном пространстве. В общем случае хватает 5-10 Мб.
Вопрос:
А у меня расчет товародвижения (еще что-то) глючит, падает на неожиданном месте...
Ответ:
Проверьте, чтобы в имени пользователя (не в его полном имени, а том, что вводится при входе в систему) и его пароле не было русских символов, точек, запятых, кавычек и других символов, кроме латинских. Кроме того, крайне рекомендуется не заводить русскоязычных пользователей в системе и оставлять путь в %TEMP% по умолчанию, лучше его переназначить на более короткий, скажем C:\TEMP, убедившись, что у всех пользователей есть на него права. И не забывайте, что в Административном модуле предпочтительно работать через supermag, другие пользователи могут нарваться на проблемы. Кроме того, не стоит работать через Terminal Services, особенно, если у вас 8i.
Вопрос:
А у меня кракозябры при выводе сообщений Oracle...
Ответ:
Общей рекомендацией будет выставить переменную окружения nls_lang=american_america.cl8mswin1251, это заставит Oracle выводить сообщения по английски, но не делайте это на машинах оператора на постоянно, при этой установке может неправильно работать сортировка строк по алфавиту, кроме того, если меняете настройку на машине с почтовым модулем, поменяйте на всех связанных с ней через почтовик машинах. Иначе разночтение дат может сказаться на пересылке пакетов. Есть еще варианты с выставлением NLS_LANG=RUSSIAN_CIS.CL8MSWIN1251 или NLS_LANG=RUSSIAN_CIS.RU8PC866 в зависимости от того, работаете ли Вы в консоли или окне Windows. Кроме того, в просторах интернета есть патч самого Oracle на этот предмет, но я бы не стал им пользоваться.
Вопрос:
Как бы вытащить хотя бы часть данных из поврежденной таблицы?
Ответ:
SELECT /* +index(Х X_1) */ a, b FROM X WHERE rowid not like номер_поврежденного_блока||'.%.'||номер_файла;
Вопрос:
Насколько смертельна остановка базы сервисом?
Ответ:
По умолчанию сервисы в Windows не убиваются (для этого есть параметр WaitToKillServiceTimeout в реестре), что касается остановки сервисом, то в Оракле по умолчанию при остановке сервиса следует shutdown immediate инстанса, а не shutdown abort, как иногда утверждается. Настройку этого можно, конечно, поменять (в Administration Assistant for Windows NT для 9i, в соотвествующей надстройке для 8i) или напрямую в реестре. Т.е. если на сервере нет кучи бестолково использованных твикеров, то таких уж ужасающих последствий остановки базы просто сервисом не будет. В крайнем случае последует сообщение, что остановить сервис не удалось (что следует учитывать при составлении батников). Другое дело, если просто вырубить сервер по питанию... И перед выключением сервера тоже рекомендуется остановить базу скриптом или через DBA Studio.
Вопрос:
Каким образом можно вывести результат выполнения скрипта в текстовый файл?
Ответ:
sqlplus -S scott/tiger@test_db @_query.sql > _result.log
SET FEEDBACK OFF в начале самого скрипта
Вопрос:
Погибло табличное пространство индексов, что делать?
Ответ:
С помощью следующего скрипта можно пометить индекс, как неиспользуемый и перестроить в другом табличном пространстве:
alter index xxx unusable;
alter index xxx rebuild tablespace yyy;

(c) OlegON 1997-2006