powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничный oracle/imp filter
25 сообщений из 31, страница 1 из 2
Тяпничный oracle/imp filter
    #39217451
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет коллеги.

Такая вот задачка. Имеется лог следующего вида.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
Connected to: Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

Export file created by EXPORT:V11.02.00 via conventional path
import done in CL8MSWIN1251 character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
. importing HR's objects into HR
 "BEGIN  "
 "sys.dbms_logrep_imp.instantiate_schema(schema_name=>SYS_CONTEXT('USERENV','"
 "CURRENT_SCHEMA'), export_db_name=>'XE', inst_scn=>'1051121');"
 "COMMIT; END;"
 "CREATE SEQUENCE "LOCATIONS_SEQ" MINVALUE 1 MAXVALUE 9900 INCREMENT BY 100 S"
 "TART WITH 3300 NOCACHE NOORDER NOCYCLE"
 "CREATE SEQUENCE "DEPARTMENTS_SEQ" MINVALUE 1 MAXVALUE 9990 INCREMENT BY 10 "
 "START WITH 280 NOCACHE NOORDER NOCYCLE"
 "CREATE SEQUENCE "EMPLOYEES_SEQ" MINVALUE 1 MAXVALUE 99999999999999999999999"
 "99999 INCREMENT BY 1 START WITH 207 NOCACHE NOORDER NOCYCLE"
 "CREATE TABLE "COUNTRIES" ("COUNTRY_ID" CHAR(2) CONSTRAINT "COUNTRY_ID_NN" N"
 "OT NULL ENABLE, "COUNTRY_NAME" VARCHAR2(40), "REGION_ID" NUMBER,  CONSTRAIN"
 "T "COUNTRY_C_ID_PK" PRIMARY KEY ("COUNTRY_ID") ENABLE ) ORGANIZATION INDEX "
 " PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINE"
 "XTENTS 1 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USE"
 "RS" LOGGING NOCOMPRESS PCTTHRESHOLD 50"
. . skipping table "COUNTRIES"                        

 "COMMENT ON TABLE "COUNTRIES" IS  'country table. Contains 25 rows. Referenc"
 "es with locations table.'"
 "COMMENT ON COLUMN "COUNTRIES"."COUNTRY_ID" IS  'Primary key of countries ta"
 "ble.'"
 "COMMENT ON COLUMN "COUNTRIES"."COUNTRY_NAME" IS  'Country name'"
 "COMMENT ON COLUMN "COUNTRIES"."REGION_ID" IS  'Region ID for the country. F"
 "oreign key to region_id column in the departments table.'"
 "CREATE TABLE "DEPARTMENTS" ("DEPARTMENT_ID" NUMBER(4, 0), "DEPARTMENT_NAME""
 " VARCHAR2(30) CONSTRAINT "DEPT_NAME_NN" NOT NULL ENABLE, "MANAGER_ID" NUMBE"
 "R(6, 0), "LOCATION_ID" NUMBER(4, 0))  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXT"
 "RANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 FREELISTS 1 FREELI"
 "ST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGGING NOCOMPRESS"
. . skipping table "DEPARTMENTS"                      

 "CREATE UNIQUE INDEX "DEPT_ID_PK" ON "DEPARTMENTS" ("DEPARTMENT_ID" )  PCTFR"
 "EE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS"
 " 1 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LO"
 "GGING"
 "CREATE INDEX "DEPT_LOCATION_IX" ON "DEPARTMENTS" ("LOCATION_ID" )  PCTFREE "
 "10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 "
 "FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGGI"
 "NG"
 "ALTER TABLE "DEPARTMENTS" ADD  CONSTRAINT "DEPT_ID_PK" PRIMARY KEY ("DEPART"
 "MENT_ID") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65"
 "536 NEXT 1048576 MINEXTENTS 1 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEF"
 "AULT) TABLESPACE "USERS" LOGGING ENABLE "
 "COMMENT ON TABLE "DEPARTMENTS" IS  'Departments table that shows details of"
 " departments where employees"
 "work. Contains 27 rows; references with locations, employees, and job_histo"
 "ry tables.'"
 "COMMENT ON COLUMN "DEPARTMENTS"."DEPARTMENT_ID" IS  'Primary key column of "
 "departments table.'"
 "COMMENT ON COLUMN "DEPARTMENTS"."DEPARTMENT_NAME" IS  'A not null column th"
 "at shows name of a department. Administration,"
 "Marketing, Purchasing, Human Resources, Shipping, IT, Executive, Public"
 "Relations, Sales, Finance, and Accounting. '"
 "COMMENT ON COLUMN "DEPARTMENTS"."MANAGER_ID" IS  'Manager_id of a departmen"
 "t. Foreign key to employee_id column of employees table. The manager_id col"
 "umn of the employee table references this column.'"
 "COMMENT ON COLUMN "DEPARTMENTS"."LOCATION_ID" IS  'Location id where a depa"
 "rtment is located. Foreign key to location_id column of locations table.'"
 "CREATE TABLE "EMPLOYEES" ("EMPLOYEE_ID" NUMBER(6, 0), "FIRST_NAME" VARCHAR2"
 "(20), "LAST_NAME" VARCHAR2(25) CONSTRAINT "EMP_LAST_NAME_NN" NOT NULL ENABL"
 "E, "EMAIL" VARCHAR2(25) CONSTRAINT "EMP_EMAIL_NN" NOT NULL ENABLE, "PHONE_N"
 "UMBER" VARCHAR2(20), "HIRE_DATE" DATE CONSTRAINT "EMP_HIRE_DATE_NN" NOT NUL"
 "L ENABLE, "JOB_ID" VARCHAR2(10) CONSTRAINT "EMP_JOB_NN" NOT NULL ENABLE, "S"
 "ALARY" NUMBER(8, 2), "COMMISSION_PCT" NUMBER(2, 2), "MANAGER_ID" NUMBER(6, "
 "0), "DEPARTMENT_ID" NUMBER(4, 0))  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRAN"
 "S 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 FREELISTS 1 FREELIST "
 "GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGGING NOCOMPRESS"
. . skipping table "EMPLOYEES"                        

 "CREATE UNIQUE INDEX "EMP_EMAIL_UK" ON "EMPLOYEES" ("EMAIL" )  PCTFREE 10 IN"
 "ITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 FREEL"
 "ISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGGING"
 "CREATE UNIQUE INDEX "EMP_EMP_ID_PK" ON "EMPLOYEES" ("EMPLOYEE_ID" )  PCTFRE"
 "E 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS "
 "1 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOG"
 "GING"
 "CREATE INDEX "EMP_DEPARTMENT_IX" ON "EMPLOYEES" ("DEPARTMENT_ID" )  PCTFREE"
 " 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1"
 " FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGG"
 "ING"
 "CREATE INDEX "EMP_JOB_IX" ON "EMPLOYEES" ("JOB_ID" )  PCTFREE 10 INITRANS 2"
 " MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 FREELISTS 1 F"
 "REELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGGING"
 "CREATE INDEX "EMP_MANAGER_IX" ON "EMPLOYEES" ("MANAGER_ID" )  PCTFREE 10 IN"
 "ITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 FREEL"
 "ISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGGING"
 "CREATE INDEX "EMP_NAME_IX" ON "EMPLOYEES" ("LAST_NAME" , "FIRST_NAME" )  PC"
 "TFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTE"
 "NTS 1 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS""
 " LOGGING"
 "ALTER TABLE "EMPLOYEES" ADD CONSTRAINT "EMP_SALARY_MIN" CHECK (salary > 0) "
 "ENABLE NOVALIDATE"
 "ALTER TABLE "EMPLOYEES" ADD  CONSTRAINT "EMP_EMAIL_UK" UNIQUE ("EMAIL") USI"
 "NG INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048"
 "576 MINEXTENTS 1 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESP"
 "ACE "USERS" LOGGING ENABLE "
 "ALTER TABLE "EMPLOYEES" ADD  CONSTRAINT "EMP_EMP_ID_PK" PRIMARY KEY ("EMPLO"
 "YEE_ID") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 655"
 "36 NEXT 1048576 MINEXTENTS 1 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFA"
 "ULT) TABLESPACE "USERS" LOGGING ENABLE "
 "COMMENT ON TABLE "EMPLOYEES" IS  'employees table. Contains 107 rows. Refer"
 "ences with departments,"
 "jobs, job_history tables. Contains a self reference.'"
 "COMMENT ON COLUMN "EMPLOYEES"."EMPLOYEE_ID" IS  'Primary key of employees t"
 "able.'"
 "COMMENT ON COLUMN "EMPLOYEES"."FIRST_NAME" IS  'First name of the employee."
 " A not null column.'"
 "COMMENT ON COLUMN "EMPLOYEES"."LAST_NAME" IS  'Last name of the employee. A"
 " not null column.'"
 "COMMENT ON COLUMN "EMPLOYEES"."EMAIL" IS  'Email id of the employee'"
 "COMMENT ON COLUMN "EMPLOYEES"."PHONE_NUMBER" IS  'Phone number of the emplo"
 "yee; includes country code and area code'"
 "COMMENT ON COLUMN "EMPLOYEES"."HIRE_DATE" IS  'Date when the employee start"
 "ed on this job. A not null column.'"
 "COMMENT ON COLUMN "EMPLOYEES"."JOB_ID" IS  'Current job of the employee; fo"
 "reign key to job_id column of the"
 "jobs table. A not null column.'"
 "COMMENT ON COLUMN "EMPLOYEES"."SALARY" IS  'Monthly salary of the employee."
 " Must be greater"
 "than zero (enforced by constraint emp_salary_min)'"
 "COMMENT ON COLUMN "EMPLOYEES"."COMMISSION_PCT" IS  'Commission percentage o"
 "f the employee; Only employees in sales"
 "department elgible for commission percentage'"
 "COMMENT ON COLUMN "EMPLOYEES"."MANAGER_ID" IS  'Manager id of the employee;"
 " has same domain as manager_id in"
 "departments table. Foreign key to employee_id column of employees table."
 "(useful for reflexive joins and CONNECT BY query)'"
 "COMMENT ON COLUMN "EMPLOYEES"."DEPARTMENT_ID" IS  'Department id where empl"
 "oyee works; foreign key to department_id"
 "column of the departments table'"
 "CREATE TABLE "JOB_HISTORY" ("EMPLOYEE_ID" NUMBER(6, 0) CONSTRAINT "JHIST_EM"
 "PLOYEE_NN" NOT NULL ENABLE, "START_DATE" DATE CONSTRAINT "JHIST_START_DATE_"
 "NN" NOT NULL ENABLE, "END_DATE" DATE CONSTRAINT "JHIST_END_DATE_NN" NOT NUL"
 "L ENABLE, "JOB_ID" VARCHAR2(10) CONSTRAINT "JHIST_JOB_NN" NOT NULL ENABLE, "
 ""DEPARTMENT_ID" NUMBER(4, 0))  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 25"
 "5 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 FREELISTS 1 FREELIST GROU"
 "PS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGGING NOCOMPRESS"
. . skipping table "JOB_HISTORY"                      
.......
........
......
 "ALTER TRIGGER "UPDATE_JOB_HISTORY"  ENABLE"
 "ALTER TABLE "EMPLOYEES" ENABLE CONSTRAINT "EMP_SALARY_MIN""
 "ALTER TABLE "JOB_HISTORY" ENABLE CONSTRAINT "JHIST_DATE_INTERVAL""
 "ALTER TABLE "LOCATIONS" ENABLE CONSTRAINT "LOC_C_ID_FK""
 "ALTER TABLE "JOB_HISTORY" ENABLE CONSTRAINT "JHIST_DEPT_FK""
 "ALTER TABLE "EMPLOYEES" ENABLE CONSTRAINT "EMP_DEPT_FK""
 "ALTER TABLE "JOB_HISTORY" ENABLE CONSTRAINT "JHIST_EMP_FK""
 "ALTER TABLE "EMPLOYEES" ENABLE CONSTRAINT "EMP_MANAGER_FK""
 "ALTER TABLE "DEPARTMENTS" ENABLE CONSTRAINT "DEPT_MGR_FK""
 "ALTER TABLE "JOB_HISTORY" ENABLE CONSTRAINT "JHIST_JOB_FK""
 "ALTER TABLE "EMPLOYEES" ENABLE CONSTRAINT "EMP_JOB_FK""
 "ALTER TABLE "DEPARTMENTS" ENABLE CONSTRAINT "DEPT_LOC_FK""
 "ALTER TABLE "COUNTRIES" ENABLE CONSTRAINT "COUNTR_REG_FK""
Import terminated successfully without warnings.



Это побочный эффект работы утилиты imp с опцией show=y
Код: sql
1.
$ imp hr@xe show=y file=hr.dmp log=hr.imp.log



При включении этой опции утилита imp не выполняет
испорт а спулирует команды в текстовый лог.

Необходимо:

1) Преобразовать его в нормальный скриптовый формат, пригодный для запуска в среде SQL*PLus

Пример:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
CREATE SEQUENCE "LOCATIONS_SEQ" MINVALUE 1 MAXVALUE 9900 INCREMENT BY 100 START WITH 3300 NOCACHE NOORDER NOCYCLE
/

CREATE SEQUENCE "DEPARTMENTS_SEQ" MINVALUE 1 MAXVALUE 9990 INCREMENT BY 10 START WITH 280 NOCACHE NOORDER NOCYCLE
/

CREATE SEQUENCE "EMPLOYEES_SEQ" MINVALUE 1 MAXVALUE 99999999999999999999999" "99999 INCREMENT BY 1 START WITH 207 NOCACHE NOORDER NOCYCLE
/

CREATE TABLE "COUNTRIES" (
  "COUNTRY_ID"   CHAR(2) CONSTRAINT "COUNTRY_ID_NN" NOT NULL ENABLE, 
  "COUNTRY_NAME" VARCHAR2(40), 
  "REGION_ID"    NUMBER,  
  CONSTRAINT "COUNTRY_C_ID_PK" PRIMARY KEY ("COUNTRY_ID") ENABLE 
) 
ORGANIZATION INDEX 
LOGGING
/
.
.

CREATE UNIQUE INDEX "EMP_EMP_ID_PK" ON "EMPLOYEES" ("EMPLOYEE_ID" ) 
LOGGING
/
.
.
.



2) Убрать дополнительную информацию о физическом хранении

Пример того ЧТО надо удалять
Код: sql
1.
2.
3.
" PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINE"
 "XTENTS 1 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USE"
 "RS" LOGGING NOCOMPRESS PCTTHRESHOLD 50"



3) Трансформация

3.1) Опционально - убрать сведения о tablespaces

Пример того ЧТО надо удалять
Код: sql
1.
TABLESPACE "USERS" 



3.1) Опционально - трансформировать tablespaces (ниже в примерах
как реализовать покажу).

4) Опционально - убрать опции partitions. (Детально поясню чуть позже
но грубо говоря - удаляем все после ключевого слова PARTITION BY ... )

5) Опционально - оставить только скрипты для создания tables, views, indexes.
Все остальные - убрать.

FAQ:

Q: Почему нельзя законнектиться к исходной базе и сделать экспорт DDL скриптов
с использованием Toad?
A: Исходная БД недоступна. Нет прав. Или вообще БД уже не сущестует.

Q: Почему нельзя просто импортировать dump в тестовую БД и на основе ее создать скрипт?
A: Импорт не возможен т.к. целевая БД - express edition (бесплатная версия) либо
не поддерживает опции partitioning, либо не имеет нужных tablespaces или их
создание сопряжено с трудностями.

Q: Почему нельзя было сделать expdp?
A: Так получилось.

Как реализовать?

Как-то так:
Код: sql
1.
$ oraimpfilter < hr.imp.log > hr.imp.filtered.sql



Пример командной строки с удалением tables, views.
Код: sql
1.
$ oraimpfilter dropplsqlobjects=y  < hr.imp.log > hr.imp.filtered.sql



Пример командной строки с ремаппингом tablespaces (заменить все - на USERS):
Код: sql
1.
$ oraimpfilter remaptablespaces=*;USERS < hr.imp.log > hr.imp.filtered.sql



Пример командной строки с удалением сведений о partitioning:
Код: sql
1.
$ oraimpfilter droppartitioninfo=y < hr.imp.log > hr.imp.filtered.sql



На чем реализовать?

На чем угодно. Главное чтоб можно было запускать из консоли.

Ссылки по теме

https://docs.oracle.com/cd/E11882_01/server.112/e22490/original_import.htm#SUTIL001


Go! Go!

P.S. И я тоже гоу...

P.P.S В данном примере я использовал учебную схему HR из набора скриптов Oracle 11.2.0.XE
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39217813
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По структуре бросается в глаза ограничение кавычками каждой строки и перенос на следующую при превышении длины.
Т.е. алгоритм примерно такой:
1. Прочитать очередную строку
2. Если не начинается с " и не заканчивается " то п.1.
3. Убрать " в начале и в конце и вывести строку
4. Длина строки максимальная? Если нет - добавить перевод строки.
5. переход к п.1

Например
Код: sql
1.
2.
3.
4.
 "BEGIN  "
 "sys.dbms_logrep_imp.instantiate_schema(schema_name=>SYS_CONTEXT('USERENV','"
 "CURRENT_SCHEMA'), export_db_name=>'XE', inst_scn=>'1051121');"
 "COMMIT; END;"


будет
Код: sql
1.
2.
3.
BEGIN  
sys.dbms_logrep_imp.instantiate_schema(schema_name=>SYS_CONTEXT('USERENV','CURRENT_SCHEMA'), export_db_name=>'XE', nst_scn=>'1051121');
COMMIT; END;
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39217821
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T4. Длина строки максимальная? Если нет - добавить перевод строки.

Я не помню точно где декларирована максимальная толщина DDL команды
но можно исходить из 32k символов (максимум для переменной VARCHAR2).
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39217867
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опция

Код: sql
1.
remaptablespaces=*;USERS



следует понимать что все табличные пространства нужно замапить на USERS.

Или еще вариант
Код: sql
1.
remaptablespaces=MAYTONS_TBLS;TB_SEGM;MAYTONS_INDX;INDEX_SEGM


более детальный.
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39217897
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более плотный пример с удалением секции PARTITION_BY я приведу скоро. Только найду
подходящий пример.
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39218010
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ не помню точно где декларирована максимальная толщина DDL команды но можно исходить из 32k символов (максимум для переменной VARCHAR2).
Нельзя. Существует полно DDL команд длиннее 32K (текст больших package body).
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39218032
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarermaytonЯ не помню точно где декларирована максимальная толщина DDL команды но можно исходить из 32k символов (максимум для переменной VARCHAR2).
Нельзя. Существует полно DDL команд длиннее 32K (текст больших package body).
Давайте пока проигнорируем этот момент. Пускай это нас не волнует
в процессе написания imp filter.
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39218105
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нафига это надо с практической точки зрения?

1. Бросается в глаза, что в логе нет никакого символа "конец команды".
Т.е. разделить входной поток мусора из лога на отдельные команды - задача НЕ тревиальная

2. Подмена данных, да еще и осмысленная.....
Можно через regexp - быстро, дешево, НЕ надежно и глюкаво
Писать свой мини парсер SQL команда - НЕ быстро и НЕ дешево, зато будет гарантия более менее корректной работы.

IMHO Вывод:
1. Задача не так просто как кажется
2. Дофига отлаживаться....
3. Нет гарантии, что на других входных данных не будет ситуаций когда сглючим
4. Нафиг оно надо? Все делается и штатными средствами. IMPDP вроде умеет tablespace менять.
См. https://community.oracle.com/thread/1045936?tstart=0
5. Вместо разработки фигни, проще купить админу пива и попросить его поменять tablespace при импорте
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39218107
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonQ: Почему нельзя было сделать expdp?
A: Так получилось.

)))
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39218139
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
mayton
Код: sql
1.
hr.dmp

может лучше из него вытаскивать?
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39218156
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Leonid Kudryavtsev]
1. Бросается в глаза, что в логе нет никакого символа "конец команды".
Т.е. разделить входной поток мусора из лога на отдельные команды - задача НЕ тревиальная
[/quit]
Да. Нетривиальная. А когда это старина мейтон подкидывал вам в тяпницу банальности?

Писать свой мини парсер SQL команда - НЕ быстро и НЕ дешево, зато будет гарантия более менее корректной работы.

Давай промежуточный вариант. Без регекспов. Но и полноценный парсер тоже не надо.
Реально (99%) меня интересуют такие ключевые слова как CREATE TABLE.

4. Нафиг оно надо? Все делается и штатными средствами. IMPDP вроде умеет tablespace менять.
5. Вместо разработки фигни, проще купить админу пива и попросить его поменять tablespace при импорте
Impdp невозможен. Нету прав на файловые системы сервера. Админ пива не пьет да и вообще
нет возможности с ним дружить. Отакие пироги.
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39218157
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNosemayton
Код: sql
1.
hr.dmp

может лучше из него вытаскивать?
Можно. Это пойдет другой тяпничной задачкой когда я найду краш-нутые
дампы.
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39219493
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Up. Ну чо? Ну как?
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39219500
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДавай промежуточный вариант. Без регекспов. Но и полноценный парсер тоже не надо.
Реально (99%) меня интересуют такие ключевые слова как CREATE TABLE.
Лет 12 назад делал свой парсер на yaxx/lex. Нужно было отпарсить наш код на PL/SQL и потом зависимости оптимизировать. Месяца 2-а игрался. Т.ч. уже не интересно )))

Берешь SQL Reference от Oracle и делаешь парсер. В чем проблема? Кроме дофига убитого времени на фигню (((

maytonImpdp невозможен. Нету прав на файловые системы сервера. Админ пива не пьет да и вообще
нет возможности с ним дружить. Отакие пироги.
Поставь Oracle в виртуалку. Загрузи только описание таблиц, без данных. Делов на полдня, не напрягаясь.

А я пошел пить пиво )))
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39219503
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо Леонид. Ты - как всегда - точен

А я пошёл. Меня теперь ждёт SQLite и картография мать ее пятак.
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39219547
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonUp. Ну чо? Ну как?
Ораклов нет, да и не знаю его. Под стандартный SQL бесполезно подгонять. Сферический конь получится.
Пробовал моим алгоритмом пройтись? 19070335
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39220252
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, меня терзают смутніе сомнения по поводу

4. Длина строки максимальная? Если нет - добавить перевод строки.
Посмотрю еще экспорты где длина вдруг(!) случайно совпала с макисмальной.
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39220256
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По большому счету пофиг если в 1-2 местах слепит то что не надо слеплять. Запустишь скрипт - сглючит, поправишь руками и снова запустишь. Как понимаю потестить - не проблема.

Выложи какой-нибудь файл с логом.
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39220396
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПо большому счету пофиг если в 1-2 местах слепит то что не надо слеплять. Запустишь скрипт - сглючит, поправишь руками и снова запустишь. Как понимаю потестить - не проблема.

Можно добавить стоп-слова такие как CREATE, ALTER, DROP.... они практически всегда стартуют новую команду.

Выложи какой-нибудь файл с логом.Вообще ни проблема выложить. Проблема - отбелить данные
чтоб не было следа каких-то бизнес-тайн.
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39220420
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМожно добавить стоп-слова такие как CREATE, ALTER, DROP.... они практически всегда стартуют новую команду.
Можно. Хуже не будет. Если в начале слово из набора - начинать с новой строки.
maytonВообще ни проблема выложить. Проблема - отбелить данные
чтоб не было следа каких-то бизнес-тайн.
Реальные не стоит. В оракле нет какой-нибудь демо-базы? С инета что-нибудь качни.
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39220528
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TРеальные не стоит. В оракле нет какой-нибудь демо-базы? С инета что-нибудь качни.
Признаюсь честно. Не находил. Хотя лет 10 назад начал работать именно с Оракла много и плотно.
Ну... в 1000 раз вероятнее найти дамп MySQL, PostgreS чемсабж. Наверное само по себе комьюнити
достаточно закрыто и ничего особо не шарит крупного.
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39220537
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TРеальные не стоит. В оракле нет какой-нибудь демо-базы?
Есть scott / tiger. Можно поставить в момент установки системы.

Хочется серьезной демо-БД на пару десятков гигабайт?... Не проблема )))
Есть Oracle e-Business Suite, демо версия Vision )))
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39220538
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПризнаюсь честно. Не находил....
Scott / Tiger

- А это неуловимый Джо
- а почему неуловимый, его никто поймать не может?
- да кому он нужен )))
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39220542
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev, спасибо. Гляну.
...
Рейтинг: 0 / 0
Тяпничный oracle/imp filter
    #39220782
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Накидал заготовку парсера. Обрезает кавычки, переносит по длине строки и ключевым словам
Исходник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
#include <iostream>
#include <fstream>
#include <string>
#include <set>

using namespace std;

// разбор строки лога
void prepare_line(string& s) {
	if (s[0] != ' ' || s[1] != '"' || s[s.length() - 1] != '"') {
		s.clear();
	} else {
		s = s.substr(2, s.length() - 3);
	}
}

// Первое слово
string first_word(string s) {
	size_t pos = s.find(' ', 0);
	if(pos == string::npos) {
		return s;
	} else {
		return s.substr(0, pos);
	}
}

// Запись строки результата
void store_row(ofstream& out, string& row) {
	if (row.empty()) return;
	// сюда можно добавить вывод с форматированием и вырезание лишнего
	out << row << endl;
	row.clear();
}

// Разбор лога
void parse_log(string file, string file_out) {
	ifstream in(file);
	// поиск макс. длины строки
	size_t max = 0, cnt = 0; // макс. ширина и кол-во повторов
	string s;
	while (getline(in, s) && cnt < 10) {
		prepare_line(s);
		if(s.length() > max) {
			max = s.length();
			cnt = 0;
		} else if (max == s.length()) {
			cnt++;
		}
	}
	// Разбор
	in.seekg(0);
	ofstream out(file_out);
	string row;
	set<string> keywords = {"CREATE", "ALTER", "DROP", "COMMENT"}; // Ключевые слова начала строки
	while (getline(in, s)) {
		prepare_line(s);
		if(keywords.find(first_word(s)) != keywords.end()) {
			store_row(out, row);
		}
		row += s;
		if(s.length() != max) {
			//if (keywords.find(first_word(row)) == keywords.end() && !first_word(row).empty()) cout << "New keyword: " << first_word(row) << endl;
			store_row(out, row);
		}
	}
	store_row(out, row);
	out.close();
}

int main()
{
	parse_log("input.txt", "output.txt");

	return 0;
}


Попробуй на реальных логах, может этого достаточно.
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничный oracle/imp filter
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]