Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / CLMSWIN1251 -> UTF8 и поля varchar2 / 21 сообщений из 21, страница 1 из 1
14.10.2021, 00:37
    #40104249
ded-mazay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
Доброго времени!
Собсно создал пустую базу, увеличил макс. длину полей varchar2 (rdbms/admin/utl32k.sql) т.к. в боевой есть varchar2 поля со значениями близкими по длине к 4000:
Код: plsql
1.
2.
3.
4.
5.
SQL> show parameter max_string

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
max_string_size                      string      EXTENDED


Подскажите пж как правильно снять структуру таблиц (без данных) с боевой базы, заменить все значения длины varchar2 на длину*2, накатить эту измененную структуру на пустую базу, потом накатить дамп сделанный экспортом?
При импорте мне же не надо указывать в какой кодировке значения в файле дампа - оно внутри файла же указано, просто делаю стандартный imp full=y?
И при импорте в случае отсутствия объекты создаются же но существующие не пересоздаются, т.е. существующие таблицы не пересоздадутся, но заполняться?
...
Рейтинг: 0 / 0
14.10.2021, 04:17
    #40104264
ma1tus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
или "на ровном месте", или... ) и, как-то, вопрос - по своему представлению решения.. (
*дампы exp'а, если не изменяет, правились в sed/far etc
тест на паре табличек какие-то вопросы снимет
...
Рейтинг: 0 / 0
14.10.2021, 05:43
    #40104265
ded-mazay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
ma1tus , т.е. предлагаете копать дамп? Дискомфорт какой-нить будет при его редактировании? - он ~2.5 Гб весит.. Хотя можно же exp не full делать, а только tables?
...
Рейтинг: 0 / 0
14.10.2021, 05:59
    #40104266
ded-mazay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
Т.е.
Код: plaintext
expdp system/pwd SCHEMAS=mydbowner DIRECTORY=/my/exp/dir DUMPFILE=sid.dmp CONTENT=METADATA_ONLY
оно? И потом редактировать полученный sid.dmp?
...
Рейтинг: 0 / 0
14.10.2021, 09:45
    #40104303
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
А зачем редактировать dump
просто пробежаться по dba_tab_columns и сделать alter table mytab modify column_name varchar2(data_length)
+ можно пробежать по dba_source

p.s. Так делал когда varchar2 byte переделывал на char
...
Рейтинг: 0 / 0
14.10.2021, 10:19
    #40104313
shane54
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
Пока не поздно и ваши рассуждения не разошлись слишком далеко / топик в самом начале - вам нужно определиться. Один говорит про старый экспорт (утилиты exp/imp):

ma1tus
*дампы exp'а, если не изменяет, правились в sed/far etc


А второй - говорит про Data Pump (утилиты expdp/impdp):

ded-mazay
Т.е.
Код: plaintext
expdp system/pwd SCHEMAS=mydbowner DIRECTORY=/my/exp/dir DUMPFILE=sid.dmp CONTENT=METADATA_ONLY
оно? И потом редактировать полученный sid.dmp?


Разница, мягко говоря, существенная, особенно в контексте того что вы тут собрались руками править внутренности дампов. Кстати, дампы Data Pump'а - там внутри вообще XML'ы.

Автору - Вы бы соблюли стандартные правила оформления вопросов, и указали бы все что нужно, включая версию базы, ОС и тот метод экспорта, который планируете использовать.
...
Рейтинг: 0 / 0
14.10.2021, 10:20
    #40104314
ded-mazay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
11.2.0.3 вроде не умеет max_string_size EXTENDED, во всяком случае utl32k.sql в коробке с ней нет. Т.е. я не могу на продакте изменить длину полей, т.к. есть значения длиной почти 4k символов и нет возможности установить длину более 4k. Всего полей varchar2 в базе кстати 2010 ;)
Зато вычитал что в 11.2 impdp умеет записывать DDL в файл не выполняя при этом ничего в БД
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQLFILE
Default: none
Purpose
Specifies a file into which all of the SQL DDL that Import would have executed, based on other parameters, is written.

Syntax and Description
SQLFILE=[directory_object:]file_name

The file_name specifies where the import job will write the DDL that would be executed during the job. The SQL is not actually executed, and the target system remains unchanged. The file is written to the directory object specified in the DIRECTORY parameter, unless another directory_object is explicitly specified here. Any existing file that has a name matching the one specified with this parameter is overwritten.
Note that passwords are not included in the SQL file. For example, if a CONNECT statement is part of the DDL that was executed, it will be replaced by a comment with only the schema name shown. In the following example, the dashes indicate that a comment follows, and the hr schema name is shown, but not the password.

-- CONNECT hr
Therefore, before you can execute the SQL file, you must edit it by removing the dashes indicating a comment and adding the password for the hr schema (in this case, the password is also hr), as follows:

CONNECT hr/hr
For Streams and other Oracle database options, anonymous PL/SQL blocks may appear within the SQLFILE output. They should not be executed directly.

Example
The following is an example of using the SQLFILE parameter. You can create the expfull.dmp dump file used in this example by running the example provided for the Export FULL parameter. See FULL.

> impdp hr/hr DIRECTORY=dpump_dir1 DUMPFILE=expfull.dmp SQLFILE=dpump_dir2:expfull.sql


Это все конечно хорошо, НО вопрос получается остается открытым - мне нужно выгрузить только структуру, чтобы не работать с файлом соержащим данных на 2.5 Гб..
...
Рейтинг: 0 / 0
14.10.2021, 10:35
    #40104321
ded-mazay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
shane54 , я чюток не успел с предидущим постом.. )
Жаль топики редактировать нельзя - сразу хотел поправить..
Oracle 11.2.0.3 в кодировке CLMSWIN1251 -> 19c UTF8
Для того, чтобы конвертировать при импорте данные в UTF8 нужно сначала любыми средствами выгрузить из 11.2 мета создания собсно этой базы и заменить длину всех полей varchar2 на длина*2
exp/imp или expdp/impdp это будет без разницы. в impdp по крайней мере есть создание sql файла содержащего DDL но мне нужен этот sql только с метаданными, без дата
...
Рейтинг: 0 / 0
14.10.2021, 10:59
    #40104329
shane54
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
Ну я честно говоря не вижу, где проблема. Все делается как Вы и говорите - через impdp создаёте SQLFILE, загружаете его в базу, потом как подсказал Vadim Lejnin, на основе %_TAB_COLUMNS генерируете скрипты с ALTER TABLE MODIFY COLUMN, прогоняете их, потом выполняете impdp в режиме APPEND - все должно получиться, что именно Вас смущает? Потренируйтесь на маленьком объеме сначала, таблиц 5-10 - отладьте скрипты - и вперёд.

P.S. Да, с редактирование постов задним числом - это всегда "палка о двух концах", каждый движок форума предлагает этот вопрос решать по-своему. Потому что если так подумать, почему так сделано - если дать пользователям возможность редактировать сколь угодно старые посты - получится каша, можно полностью изменить свое старое сообщение - и тогда все последующие ответы потенциально могут стать "ни о чем". Так что как сделано тут на sql.ru - так сделано, нам остаётся только следовать местным правилам и просто "спамить" дополнительными постами, если что-то нужно поправить относительно уже опубликованных ответов.

Ну и плюс, сколько-то минут после опубликования своего ответа, его можно таки редактировать. Много раз видел сообщение внизу поста "отредактировано <тогда-то>". Вот сейчас впервые тоже попробовал :)
...
Рейтинг: 0 / 0
14.10.2021, 11:53
    #40104344
ded-mazay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
ОК, буду пробовать, думается будет много проблем с тем, что некоторые записи создадутся когда я sql файл загоню в базу, и продублируются когда имп сделаю..
На счет редактора - обычно править можно только если это последний пост для данного топика и автор этого поста = текущий посетитель
...
Рейтинг: 0 / 0
14.10.2021, 12:37
    #40104351
shane54
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
ded-mazay
... думается будет много проблем с тем, что некоторые записи создадутся когда я sql файл загоню в базу, и продублируются когда имп сделаю..


Это почему? Есть Metadata Import, есть Data-Only Import. Почему дубликаты, откуда? И вообще, Вы же знаете, в "нашем мире" нет термина "думаю", "наверно", "скорее всего" - мы просто берём и тестируем, любую теорию, любое сомнение. Касательно Вашей задачи - намного важнее не забыть после загрузки SQLFILE (т.е. фактически после выполнения импорта Metadata-Only) и после ALTER всех полей на предмет расширения, не забыть отключить все триггера и ограничения (Constraints), внешние ключи (Foreign Keys), Check Constraints - вот это все. Тоже, конечно, нагенерите скриптов, а потом не забудьте включить все обратно (тоже скриптами конечно). И при включении, если записей не миллиарды - я обычно ещё ENABLE VALIDATE делаю, чтоб два раза себя перепроверить, что точно все логически правильно перенеслось. Вот если это забыть, отключение триггеров - вот тогда точно такие дубликаты можно получить, что до скончания веков не вычистить. Хотя, конечно, зависит от Вашей архитектуры, от того какие именно триггеры есть (если вообще есть).
...
Рейтинг: 0 / 0
14.10.2021, 13:35
    #40104375
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
Vadim Lejnin
alter table mytab modify column_name varchar2(data_length CHAR )
...
Рейтинг: 0 / 0
14.10.2021, 14:32
    #40104411
ded-mazay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
мм.. если делать сначала
impdp ........ SQLFILE=dpump_dir2: EXPFULL.sql CONTENT= METADATA_ONLY
то я правильно понимаю что не надо ничего отключать - из полученного файла накатится только структура, потом после обработки таблиц накатить дамп и данные сядут со всеми потрохами на свое место?
Хотя на самом деле че там писать - пробовать надо, благо есть тестовый (пока тестовый) сервак максимально приближенный по параметрам к продакту, правда на нем развернул виртуальную среду proxmox, подготовил несколько виртуалок, даже базу не надо пересоздавать в случае чего просто грохается испорченный виртуальный хост и за несколько минут разворачивается из бекапа новый.. )
вощм пошел пробывать.. отпишу.. )
...
Рейтинг: 0 / 0
14.10.2021, 20:00
    #40104553
ded-mazay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
Наконец-то выспался..
Итак, выгрузил метаданные, только начал копаться в sql файле, сходу интересное наблюдение - обновляет профиль устанавливая PASSWORD_LIFE_TIME UNLIMITED и тут же создает залоченных пользователей с экспайред паролем.. Собсно пользователей я кроме одного импортировать вообще пока не буду и кстате владельца схемы выгрузил с паролем и без лока, хотя в доках вроде написано пароли не выгружает вообще в sql.. )
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 ALTER PROFILE "DEFAULT"
    LIMIT 
         COMPOSITE_LIMIT UNLIMITED 
         SESSIONS_PER_USER UNLIMITED 
         CPU_PER_SESSION UNLIMITED 
         CPU_PER_CALL UNLIMITED 
         LOGICAL_READS_PER_SESSION UNLIMITED 
         LOGICAL_READS_PER_CALL UNLIMITED 
         IDLE_TIME UNLIMITED 
         CONNECT_TIME UNLIMITED 
         PRIVATE_SGA UNLIMITED 
         FAILED_LOGIN_ATTEMPTS 20 
         PASSWORD_LIFE_TIME UNLIMITED 
         PASSWORD_REUSE_TIME UNLIMITED 
         PASSWORD_REUSE_MAX UNLIMITED 
         PASSWORD_VERIFY_FUNCTION NULL 
         PASSWORD_LOCK_TIME 86400/86400 
         PASSWORD_GRACE_TIME 604800/86400 ;


Код: plsql
1.
2.
3.
 CREATE USER "MYSCOWNER" IDENTIFIED BY VALUES 'S:aBrAkAdAbRa'
      DEFAULT TABLESPACE "USERS"
      TEMPORARY TABLESPACE "TEMP";



Код: plsql
1.
2.
3.
4.
5.
 CREATE USER "anyusername" IDENTIFIED BY VALUES 'S:000000000000000000000000000000000000000000000000000000000000'
      DEFAULT TABLESPACE "USERS"
      TEMPORARY TABLESPACE "TEMP"
      PASSWORD EXPIRE
      ACCOUNT LOCK;
...
Рейтинг: 0 / 0
14.10.2021, 20:34
    #40104559
ded-mazay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
andrey_anonymous
Vadim Lejnin
alter table mytab modify column_name varchar2(data_length CHAR )

теперь понял, спасибо!
собсно файлик с метаданными всего 32мб вышел, рассчитываю обойтись без пробежки с alter table - сразу как надо в sql поправлю/уберу и дамп сверху..
...
Рейтинг: 0 / 0
15.10.2021, 05:40
    #40104613
ded-mazay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
Итак, почти все норм, но есть шороховатости:
После импорта данных в талицу сыпет ошибками про статистику похоже:
ORA-20005: object statistics are locked (stattype = ALL)
Есть смысл в sql добавить в конце
Код: plsql
1.
exec dbms_stats.unlock_schema_stats('MYSCOWNER');


или оставить как есть, после импорта разблокировать и собрать статистику?
И да - триггеры все же забыл вырезать, 1-й блин комом )
...
Рейтинг: 0 / 0
15.10.2021, 11:15
    #40104671
shane54
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
Я предпочитаю статистику не импортировать вообще, и потом всегда пересобираю, когда все загрузки закончены. Если база не терабайты. Или, если статистика какая-то "хитрая", и её на старой базе руками подстраивали, всегда можно её выгрузить, и потом загрузить в новую базу. У пакета DBMS_STATS есть соответствующие процедуры.

Одно из приемуществ Data Pump - возможность достаточно гибких "политик" INCLUDE/EXCLUDE - поэтому можно в итоге добиться практически отсутствия ошибок. Так что в Вашем случае Вы можете как исключить импорт (создание) ненужных пользователей, так и не импортировать статистику. Со статистикой вообще такое дело - её более чем полезно пересобрать после окончания импорта. Вы там выше упоминали что размер дампа какие-то гигабайты, 2.5 ГБ что ли - так она пересоберется за несколько минут. Добавьте в файл параметров импорта:

Код: plsql
1.
EXCLUDE=TABLE_STATISTICS,INDEX_STATISTICS,USER"=:<список>"
...
Рейтинг: 0 / 0
15.10.2021, 11:23
    #40104673
shane54
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
ded-mazay
... то я правильно понимаю что не надо ничего отключать - из полученного файла накатится только структура, потом после обработки таблиц накатить дамп и данные сядут со всеми потрохами на свое место?


Логика такая - если Data Pump сам выполняет обе фазы - и Metadata Import и Data-Only Import - то он "все делает хорошо", и все перенесётся как надо. Если же Вы разделяете Metadata Import отдельно, Data Import отдельно, и между ними ещё и какие-то манипуляции выполняете со структурой таблиц - то подразумевается, что Вы "понимаете что Вы делаете". И при фазе Data Import, на каждую вставляемую строку сработают и триггера, и будут проверяться все ограничения на колонки (Constraints). Именно поэтому их надо отключать и вообще, следить за тем, что происходит при импорте.

Если Вы присмотритесь к логу импорта - что старого imp, что нового impdp - там есть отдельный шаг, когда он включает триггера и накатывает ограничения. Причём до какой-то степени он обладает интеллектом, и если схема данных замороченная, и есть "cross-зависимости", когда схемы ссылаются друг на друга, и образуются циклы и петли - Data Pump умеет это дело разрешать, и соблюдая некий внутренний порядок включения ограничений, в итоге все импортируется без ошибок и конфликтов. Честно говоря не вникал, как именно он это делает - может никакой магии и нет.
...
Рейтинг: 0 / 0
16.10.2021, 00:01
    #40104857
ded-mazay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
Код: plsql
1.
SELECT * FROM nls_session_parameters;


Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
PARAMETER	VALUE
NLS_LANGUAGE	AMERICAN
NLS_TERRITORY	RUSSIA
NLS_CURRENCY	?
NLS_ISO_CURRENCY	RUSSIA
NLS_NUMERIC_CHARACTERS	.
NLS_CALENDAR	GREGORIAN
NLS_DATE_FORMAT	DD.MM.YYYY
NLS_DATE_LANGUAGE	AMERICAN
NLS_SORT	BINARY
NLS_TIME_FORMAT	HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT	DD.MM.RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT	HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT	DD.MM.RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY	?
NLS_COMP	BINARY
NLS_LENGTH_SEMANTICS	BYTE
NLS_NCHAR_CONV_EXCP	FALSE


Код: plsql
1.
select * from nls_database_parameters where parameter='NLS_CHARACTERSET';


Код: html
1.
2.
PARAMETER	VALUE
NLS_CHARACTERSET	AL32UTF8


Но в консоли
Код: plsql
1.
SQL> select e_name, length(e_name), lengthB(e_name) from employees where e_id = 95;


Код: html
1.
2.
3.
E_NAME                                   LENGTH(E_NAME) LENGTHB(E_NAME)
---------------------------------------- -------------- ---------------
????????? ????????? ??????????                       30              58


Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
[oracle@adpdb ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=



Длина в байтах кажет что это ютф, а почему знаки вопроса в консоли?
...
Рейтинг: 0 / 0
16.10.2021, 00:29
    #40104861
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
NLS_LANG
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.10.2021, 00:58
    #40104865
ded-mazay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLMSWIN1251 -> UTF8 и поля varchar2
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
[oracle@adpdb /]$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
[oracle@adpdb /]$ sqlplus /nolog

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Oct 16 02:49:54 2021
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

SQL> conn adpmanager/adpmanager
Connected.
SQL> select e_name from employees where e_id = 95;

E_NAME
--------------------------------------------------------------------------------
............. АЛЕКСАНДР ВАЛЕРЬЕВИЧ


Спасибо!
Ну собсно уже почти все!
При импорте дампа было немного ругани на то, что каких-то обьектов APEX не хватает, но думается оно из-за версий 11 -> 19, еще некоторые функции и триггеры не переехали, думается из-за присутствия в них символов %, вощм еще несколько импортов с допиливанием точно будет, но основная задача с конвертом в ютф достигнута )
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / CLMSWIN1251 -> UTF8 и поля varchar2 / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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