Я пытаюсь взять несколько строк в Oracle Linux и Windows 10, оба из которых работают под управлением Oracle 21c XE Import & Export, используя expdp иimpdp, но я столкнулся с проблемами. Обе конфигурации БД идентичны.
В Linux я могу выборочно экспортировать 2 строки, в Windows я не могу выборочно экспортировать ни одну строку. Затем я намеревался импортировать 2 строки обратно в таблицу.
Данные следующие:
SQL> select count(*) from account_balance;
COUNT(*)
----------
4
SQL> SELECT ROWID, AB.* FROM ACCOUNT_BALANCE AB;
ROWID KEY_1 CURRENT_BALANCE
------------------ ---------------- ----------------
AAASyQAAMAAAAHrAAA 0000500521000111 12000
AAASyQAAMAAAAHrAAB 0000500521000112 56000
AAASyQAAMAAAAHrAAD 0000500521000114 36700
AAASyQAAMAAAAHsAAA 0000500521000113 679000
SQL> DELETE FROM ACCOUNT_BALANCE WHERE KEY_1 = '0000500521000111';
1 row deleted.
SQL> DELETE FROM ACCOUNT_BALANCE WHERE KEY_1 = '0000500521000113';
1 row deleted.
SQL> select count(*) from account_balance;
COUNT(*)
----------
2
SQL> SELECT ROWID, AB.* FROM ACCOUNT_BALANCE AB;
ROWID KEY_1 CURRENT_BALANCE
------------------ ---------------- ----------------
AAASyQAAMAAAAHrAAB 0000500521000112 56000
AAASyQAAMAAAAHrAAD 0000500521000114 36700
SQL> desc account_balance;
Name Null? Type
----------------------------------------- -------- ----------------------------
KEY_1 NOT NULL CHAR(16)
CURRENT_BALANCE CHAR(16)
SQL> SELECT table_name, owner FROM all_tables WHERE table_name='ACCOUNT_BALANCE' ORDER BY owner, table_name;
TABLE_NAME OWNER
-------------------- --------------------
ACCOUNT_BALANCE L3DBA
Используемый экспортный запрос (Oracle-Linux):
expdp L3DBA@VIRTUAL_PDB1 tables=account_balance directory=DATA_PUMP_DIR QUERY=\"WHERE KEY_1=\'0000500521000113\'\" dumpfile=acct_bal_0000500521000113_bkp.dmp logfile=acct_bal_0000500521000113_bkp.log;
expdp L3DBA@VIRTUAL_PDB1 tables=account_balance directory=DATA_PUMP_DIR QUERY=\"WHERE KEY_1=\'0000500521000111\'\" dumpfile=acct_bal_0000500521000111_bkp.dmp logfile=acct_bal_0000500521000111_bkp.log;
Используемый экспортный запрос (Windows-10):
expdp L3DBA@DESKTOP_XEPDB1 tables=account_balance directory=DATA_PUMP_DIR QUERY=\"WHERE KEY_1=\'0000500261000112\'\" dumpfile=acct_bal_bkp20230504_3.dmp logfile=acct_bal_bkp20230504_3.log;
LRM-00111: no closing quote for value ''000050026'
Используемый запрос на импорт (Oracle-Linux):
impdp L3DBA@VIRTUAL_PDB1 tables=account_balance directory=DATA_PUMP_DIR dumpfile=acct_bal_0000500521000113_bkp.dmp logfile=acct_bal_0000500521000113_imp.log CONTENT=DATA_ONLY TABLE_EXISTS_ACTION=APPEND EXCLUDE=INDEX,CONSTRAINT;
impdp L3DBA@VIRTUAL_PDB1 tables=account_balance directory=DATA_PUMP_DIR dumpfile=acct_bal_0000500521000111_bkp.dmp logfile=acct_bal_0000500521000111_imp.log CONTENT=DATA_ONLY TABLE_EXISTS_ACTION=APPEND EXCLUDE=INDEX,CONSTRAINT;
Я заметил, что, пока я был подключен к БД, при импорте выбранных строк импорт был приостановлен. Чего не было в случае, когда я пытался импортировать полную таблицу (той же таблицы). Что может быть причиной этого?
Кроме того, как мне правильно выполнить expdp и impdp в системе Windows для одних и тех же данных?
@AlexPoole Спасибо, одна проблема, из-за которой импорт приостанавливался (работал более 10 минут), была связана с проблемой фиксации. Что касается экспорта, вся команда находится в одной строке. Написано в блокноте и вставлено в терминал без новой строки. Я упустил из виду типы данных столбцов при создании.
Windows, в частности, очень требовательна к кавычкам и тому подобному в командной строке. Лично я просто бросаю вещи в ПАРФИЛЬ, чтобы облегчить жизнь.
par.dat
=======
tables=account_balance
directory=DATA_PUMP_DIR
QUERY = "WHERE KEY_1='0000500261000112'"
dumpfile=acct_bal_bkp20230504_3.dmp
logfile=acct_bal_bkp20230504_3.log;
expdp user/pass parfile=par.dat
Спасибо, можно экспортировать с помощью PARFILE. Еще одна вещь: запрос работал на CMD и Git Bash, но не на PowerShell (который использовался по умолчанию для терминала Windows). Следующий запрос сработал для меня expdp L3DBA/l3secret@DESKTOP_XEPDB1 tables=account_balance directory=DATA_PUMP_DIR QUERY=\"WHERE KEY_1='0000500261000114'\" dumpfile=acct_bal_bkp20240706.dmp logfile=acct_bal_bkp20240706.log;
Не имеет отношения к вашей проблеме, но почему вы сохраняете числовое значение, например баланс, в виде строки; и почему вы храните что-либо как
char
, а неvarchar2
? При экспорте вы уверены, что вся команда находится в одной строке, а не разделена на две после..0026
? А для импорта что значит "импорт был приостановлен"? (Может быть, вы просто не совершили удаления?) Вероятно, это должно быть два вопроса, но ни один из них на самом деле не относится к теме этого сайта.