powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Shell скрипт формирует большой размер лога 32-битного sqlplus
29 сообщений из 29, показаны все 2 страниц
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085195
Keklik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый,

Система RHEL7, 64bit.
Oracle client 64bit and 32bit.

sh-файл использует sqlplus(32bit) для вывода output в лог-файл.
Лог файл получается неадекватного размера по команде ll .
Реальный размер(точнее объем данных) невелик, и его можно проверить с помощью команд du -sh ,...
Скрипт, использующий 64битный sqlplus, проблемы этой не имеет.

Изменения 32бит скрипта приводят к тому, что ll начинает показывать нормальный(небольшой) размер.
Детали ниже, задача заставить первый скрипт отрабатывать с нормальным размером, т.к. в системе много подобных скриптов.
Непонятна эта заморочка и куда копать неясно.

Вручную в sqlplus (32bit) :
spool filename
..
spool off
Дает нормальный размер файла.


Первый скрипт:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
u01/> cat tst.sh

#!/bin/ksh

export ORACLE_HOME=/oravl01/oracle/19.3_32
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export PATH=$ORACLE_HOME/bin:$PATH

sqlplus -s testuser/testuser@TSTDB  << !

set echo on
set timing on

select  *  from from user_tables;
!

echo "Finished"

exit 0




Запускаем первый скрипт, смотрим размер лога:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
u01/>./tst.sh > tst.log

u01/>ll  tst.log 
1,497,772,720

u01/>du -sh tst.log 
96k




Убираем echo "Finished" , и ll показывает нормальный(небольшой) размер:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
u01/> cat tst.sh

#!/bin/ksh

export ORACLE_HOME=/oravl01/oracle/19.3_32
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export PATH=$ORACLE_HOME/bin:$PATH

sqlplus -s testuser/testuser@TSTDB  << !

set echo on
set timing on

select  *  from from user_tables;
!

#echo "Finished"

exit 0


Запускаем :
Код: plsql
1.
2.
3.
4.
5.
6.
7.
u01/>./tst.sh > tst.log

u01/>ll  tst.log  
94038

u01/>du -sh tst.log 
96k




Ставим вывод в файл в самом скрипте (sqlplus -s testuser/testuser@TSTDB > tst.log ) , получаем нормальный размер лога:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
u01/> cat tst.sh

#!/bin/ksh

export ORACLE_HOME=/oravl01/oracle/19.3_32
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export PATH=$ORACLE_HOME/bin:$PATH

sqlplus -s testuser/testuser@TSTDB > tst.log << !

set echo on
set timing on

select  *  from from user_tables;
!

echo "Finished"

exit 0




Запускаем третий скрипт:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
u01/>./tst.sh 


u01/>ll  tst.log  
94038

u01/>du -sh tst.log 
96k



Меняем ORACLE_HOME на 64-битного клиента - во всех случаях срабатывает нормально.
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085201
Фотография shane54
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как определён алиас ll? Что он вызывает? Почему в выводе только размер, без имени файла, группы, владельца, даты, маски прав и тд? Обычно ll это алиас к ls -ltrh или чему-то подобному.
В общем, чтобы посмотреть - выполните alias, либо alias ll.

Почему у Вас shebang-строка в начале скрипта указывает на ksh, а сам скрипт - с расширением .sh? Не уверен что это "плохо" и на что-то влияет - но тем не менее.

В качестве терминатора для SQL скрипта, который подаётся на вход SQL*Plus, Вы используете символ "!", который в SQL*Plus скриптах является алиасом команды host, суть выполняющей запуск команд ОС. Опять же не уверен что это плохо в Вашем случае, но вдруг начинается какой-то цикл, который забивает spool-файл, пока не закомментирован последний вызов echo Finished. В общем, попробуйте заменить на EOF, обычно народ в сети использует такую строку как терминатор.
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085206
Фотография shane54
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А Вы смотрели на результат вывода, который попадает в файл? Вместо SELECT * FROM USER_TABLES, попробуйте вывести только первое поле, TABLE_NAME, и добавьте сортировку - ORDER BY TABLE_NAME, сгенерите оба вывода, из под клиента 32-бита и из под 64-бита - и сравните через Notepad++, в режиме Split Screen, когда оба файла на экране, рядом друг с другом. Или в Total Commander, просто File -> Compare by Contents. Ну или ещё каким инструментом, который Вам ближе и под рукой, просто утилитой diff, если вы только под Linux, без GUI на этом сервере, и файлы вытащить для анализа нет возможности.

Честно говоря, ощущение что у Вас разные алиасы в tnsnames.ora описаны для базы TSTDB - т.е. переключая клиенты 32/64-бит, Вы соединяетесь с разными базами. Поэтому и вывод отличается. Может быть такое? Проверить очень просто конечно, начиная с tnsping TSTDB, и сравнить значение HOST и SERVICE_NAME (или SID), или, после подключения, SELECT INSTANCE_NAME, HOST_NAME FROM V$INSTANCE, тоже сразу будет видно, куда Вы подключены, сервер и экземпляр.
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085221
Keklik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за советы,

sh - ksh - без разницы.
ll - неполный вывод - у меня нет тырнета с той системы, часть примеров вручную набрал,
но смысл передан.

коннект там к одной базе, ошибки тут нет, да и потом,
вы же посмотрите - убираешь добавление строки в sh скрипте и размер файла нормальный.
Код: plsql
1.
#echo "Finished"


Тут вроде как Oracle уже вообще не при чем, ведь не sqlplus добавляет, а echo, за блоком sqlplus.
Но в 64битной версии нет этой проблемы с этой же версией скрипта и echo "Finished" не мешает.


Далее, вручную с этим же коннектом если делаешь в sqlplus:
Код: plsql
1.
2.
3.
spool fname.log
..
spool off



тоже всё нормально.

Бред какой-то, но как-то проблему решать надо или все скрипты переделывать.
Благо решение есть - даже два.

Либо использовать вывод в файл скрипте,
Код: plsql
1.
2.
3.
..
sqlplus -s testuser/testuser@TSTDB > tst.log << !
..


а не как
Код: plsql
1.
u01/>./tst.sh > tst.log



либо закомментарить последнее echo:
Код: plsql
1.
#echo "Finished"




Посмотрел количество строк в vi и cat test.log |wc -l -
в большом и маленьком файле кол-во строк одинаковое.

Но естественно по большому файлу команда дольше работала.
diff разницы не дал.

! менял на несколько вариантов(тоже мысль была) - но мимо.
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085223
Keklik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как
echo "Finished"

может увеличить размер файла в 16000 раз?
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085224
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот прямо такую вот команду
Keklik

Код: plsql
1.
select  *  from from user_tables;



выполняет без выдачи сообщения об ошибке?
Код: plsql
1.
2.
3.
4.
select  *  from from user_tables
                *
ERROR at line 1:
ORA-00903: invalid table name


:-)
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085227
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Keklik,

У SQL*Plus есть замечательная команда SPOOL.
Почему бы её не использовать?
Мсье знает толк в извращениях?
:-)
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085228
Keklik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал, чтобы скрипт выводил заведомо мало информации (rownum < 4),
размер остался огромным все-равно:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
/u01 > cat tst2.ksh

#!/bin/ksh 

export ORACLE_HOME=/oravl01/oracle/19.3_32

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

export PATH=$ORACLE_HOME/bin:$PATH


sqlplus -s testuser/testuser@TSTDB   << EOF
set echo on
set linesize 120
set timing on
set pagesize 0
select  table_name, synonym_name from syn where rownum < 4;
EOF

echo "Finished"

exit 0



Код: plsql
1.
2.
3.
4.
/u01 >./tst2.ksh > tst2.log

/u01 > ll tst2.log
-rw-r--r-- 1 oracle dba 1497493643 Jul 22 01:46 tst2.log




хотя файл почти 1.5ГБ, содержимое выводит быстро, но потом cat висит,
после Elapsed: 00:00:00.02, т.е. в конце файла лабуда какая-то напичкана:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
/u01 >cat tst2.log
tab1
tab1

tab2
tab2

tab3
tab4


Elapsed: 00:00:00.02




Комментарим echo:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
/u01 > cat tst3.ksh

#!/bin/ksh 

export ORACLE_HOME=/oravl01/oracle/19.3_32

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

export PATH=$ORACLE_HOME/bin:$PATH


sqlplus -s testuser/testuser@TSTDB   << EOF
set echo on
set linesize 120
set timing on
set pagesize 0
select  table_name, synonym_name from syn where rownum < 4;
EOF

#echo "Finished"

exit 0



Запускаем - размер лога 129 байт:
Код: plsql
1.
2.
3.
4.
/u01> ./tst3.ksh > tst3.log

/u01> ll  tst3.log
-rw-r--r-- 1 oracle dba 129 Jul 22 01:54 tst3.log




Меняю в первом скрипте export ORACLE_HOME= на 64битный - всё ОК, независимо от
echo "Finished" .
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085231
Keklik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL*Plus,
SQL*Plusвыполняет без выдачи сообщения об ошибке?

Я же написал, что часть скриптов руками добирал, а не копировал с рабочего примера.
Следующие примеры аккуратнее сделал.

И пожалуйста читайте, что я пишу - в первом сообщении указано,
что вручную в sqlplus :
spool fname
...
spool off

работает всё нормально.
Там беда начинается ЗА БЛОКОМ sqlplus.
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085232
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Keklik,

1) Сделайте файл runme-32.sql
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
set echo on
set linesize 120
set timing on
set pagesize 0

SPOOL runme-32.log
select  table_name, synonym_name from syn where rownum < 4;
SPOOL OFF;
EXIT;


Выполните его 32-битным SQL*Plus

Код: plaintext
sqlplus -s testuser/testuser@TSTDB @runme-32.sql


2) Сделайте файл runme-64.sql
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
set echo on
set linesize 120
set timing on
set pagesize 0

SPOOL runme-64.log
select  table_name, synonym_name from syn where rownum < 4;
SPOOL OFF;
EXIT;


Выполните его 64-битным SQL*Plus.

Код: plaintext
sqlplus -s testuser/testuser@TSTDB @runme-64.sql


3) Сравните результаты.
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085233
Keklik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL*Plus,

Мсье, это дает одинаковый результат, об этом написано в первом сообщении.
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085234
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Keklik
SQL*Plus,
Там беда начинается ЗА БЛОКОМ sqlplus.

Тогда вам надо это всё писать в форуме про Linux/UNIX, ибо SQL*Plus здесь не при чём .
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085237
Keklik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На одну строку различается кол-во строк, вот она и раздута:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
u01/> ll tst2.log
-rw-r--r-- 1 oracle dba 1497493643 Jul 22 01:46 tst2.log

u01/> ll tst3.log
-rw-r--r-- 1 oracle dba 129 Jul 22 01:54 tst3.log
 
u01/> cat tst2.log| wc -l
12

u01/> cat tst3.log |wc -l
11
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085239
Keklik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторибо SQL*Plus здесь не при чём .
и про это я тоже написал.
Этим бы и занялся(писать линуксоидам), но когда используется 64-битный клиент(ORACLE_HOME в скрипте) - проблемы НЕТ.
Значит версия клиента влияет.
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085240
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Keklik
авторибо SQL*Plus здесь не при чём .

и про это я тоже написал.
Этим бы и занялся(писать линуксоидам), но когда используется 64-битный клиент - проблемы НЕТ.
Значит версия клиента влияет.

Проведите описанный выше эксперимент 22349619 и после этого делайте выводы.
Пока ваш вывод - это не более, чем фантазия.
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085244
Keklik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
т.е. то что я говорю, с первого сообщения, что вручную со
spool fname
работает с любым клиентом - это фантазия?


Еще показательно, в первом сообщении, третий пример тоже
работает(вывод в файл в самом скрипте задан sqlplus -s testuser/testuser@TSTDB > tst.log ):

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
u01/> cat tst.sh

#!/bin/ksh

export ORACLE_HOME=/oravl01/oracle/19.3_32
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export PATH=$ORACLE_HOME/bin:$PATH

sqlplus -s testuser/testuser@TSTDB > tst.log << !

set echo on
set timing on

select  *  from  user_tables;
!

echo "Finished"

exit 0 




запуск:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
u01/>./tst.sh 


u01/>ll  tst.log  
94038

u01/>du -sh tst.log 
96k




По примеру с rownum <4, в vi перейти на 12 строку не получается.
Визуально там 11 строк в большом файле, все также как в мелком.

Включил отображение скрытых файлов (set list) - картинка на обоих файлах одинакова.

Но у большого файла больше на одну строку по cat :
Код: plsql
1.
2.
3.
4.
5.
u01/> cat tst2.log| wc -l
12

u01/> cat tst3.log |wc -l
11
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085246
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Keklik,

Слишком много слов и мало дел.

Еще проверьте командой which, какие именно SQL*Plus вызываются в каждом случае

Код: plsql
1.
2.
$ which sqlplus
/u01/app/oracle/product/19.0.0.0/dbhome_1/bin/sqlplus
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085248
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Keklik,

Посмотрите ваш файл программой hexdump

Код: plaintext
$ hexdump -C tst2.log | more
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085253
Keklik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл дать сравнение:

Код: plsql
1.
2.
3.
4.
5.
u01/> cmp  -c tst2.log tst2-2.log

u01/> cmp -b -l tst2.log tst3.log
128  62 2     60 0
cmp: EOF on tst3.log




авторСлишком много слов и мало дел
И кто-то писатель похоже.

Завтра продолжу разбираться.
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085254
Keklik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
>which sqlplus
/oravl01/oracle/19.3_32/bin/sqlplus

>file   /oravl01/oracle/19.3_32/bin/sqlplus
/oravl01/oracle/19.3_32/bin/sqlplus: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0b7ab7cb6578f679074bd1f06788e4780aee89f2, not stripped



упростил до предела запрос:
Код: plsql
1.
select sysdate from dual;




tst2.ksh добавил which sqlplus
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
>ls -l *log
-rw-r--r-- 1 oracle dba 1498103886 Jul 22 03:16 tst2.log
-rw-r--r-- 1 oracle dba         32 Jul 22 03:18 tst3.log

>hexdump -C tst2.log | more
00000000  2f 6f 72 61 76 6c 30 31  2f 6f 72 61 63 6c 65 2f  |/oravl01/oracle/|
00000010  31 39 2e 33 5f 33 32 2f  62 69 6e 2f 73 71 6c 70  |19.3_32/bin/sqlp|
00000020  6c 75 73 0a 32 32 2d 4a  55 4c 2d 32 31 0a 0a 45  |lus.22-JUL-21..E|
00000030  6c 61 70 73 65 64 3a 20  30 30 3a 30 30 3a 30 30  |lapsed: 00:00:00|
00000040  2e 30 31 0a 00 00 00 00  00 00 00 00 00 00 00 00  |.01.............|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
594b4040  00 00 00 00 00 46 69 6e  69 73 68 65 64 0a        |.....Finished.|
594b404e



Код: plsql
1.
2.
3.
4.
>hexdump -C  tst3.log | more
00000000  32 32 2d 4a 55 4c 2d 32  31 0a 0a 45 6c 61 70 73  |22-JUL-21..Elaps|
00000010  65 64 3a 20 30 30 3a 30  30 3a 30 30 2e 30 30 0a  |ed: 00:00:00.00.|
00000020
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085263
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Keklik,

Почему после селекта нет команды exit; для sqlplus?
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085274
Keklik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sayan Malakshinov,

В рабочем примере есть exit.
Но без него, кстати тоже будет работать.
Как понять что за данные размещены в последней строке
и как оно туда попадает? - строка примерно в 1.4ГБ.
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085275
Keklik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL*Plus,

Прогнал runme-32.sql, runme-64.sql в 32-битном и 64-битном клиентах.
Как и говорил, там всё работает, и лог-файлы получаются одинаковыми - небольшой размер, diff тоже не находит отличий.
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085291
Keklik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Убрал лишнее, оставил два простых примера в 32-битном клиенте.
В текстовый файл выводится sysdate - т.е. размер файла должен быть минимальным.

Отличие примеров только в том, что после блока sqlplus , в первом случае идет
добавление строки командой:
echo "Finished"

Во втором примере echo закоментарен:
#echo "Finished"

Далее вручную добавляю строку к результатам работы второго примера(echo "Finished" >> tst3.log),
но такое добавление не увеличило до ГБ размера файла, хотя оно ничем не отличается от echo в ksh-скрипте.

Первый пример, генерит огромный файл, в котором содержится одна строка с sysdate:
Код: 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.
> cat tst2.ksh
#!/bin/ksh 


export ORACLE_HOME=/oravl01/oracle/19.3_32

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

export LIBHOME=/oravl01/oracle/19.3_32/lib


export PATH=$ORACLE_HOME/bin:$PATH


sqlplus -s testuser/testuser@TSTDB  << EOF
set echo on
set linesize 120
set timing on
set pagesize 0
select sysdate from dual;
exit
EOF

echo "Finished"

exit 0



Запускаем, получаем огромный файл:
Код: plsql
1.
2.
3.
4.
> ./tst2.ksh > tst2.log

> ll  tst2.log
-rw-r--r-- 1 oracle dba 1497878570 Jul 22 11:22 tst2.log




Второй пример, после блока sqlplus закомментарено добавление строки #echo "Finished":
Код: 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.
> cat tst3.ksh
#!/bin/ksh 


export ORACLE_HOME=/oravl01/oracle/19.3_32

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

export LIBHOME=/oravl01/oracle/19.3_32/lib


export PATH=$ORACLE_HOME/bin:$PATH


sqlplus -s testuser/testuser@TSTDB   << EOF
set echo on
set linesize 120
set timing on
set pagesize 0
select sysdate from dual;
exit
EOF

#echo "Finished"

exit 0



Запускаем, получаем нормальный размер файла:
Код: plsql
1.
2.
3.
4.
5.
6.
> ./tst3.ksh > tst3.log


> ll tst*log
-rw-r--r-- 1 oracle dba 1497878570 Jul 22 11:22 tst2.log
-rw-r--r-- 1 oracle dba         32 Jul 22 11:44 tst3.log




Сравниваем файлы, diff ругается на бинарный файл, cmp показывает наличие
символа EOF в tst3.log(в небольшом файле), и по факту не находит в tst2.log строки
с текстом Finished, т.е. вместо Finished echo добавило непойми что в скрипте на 1.4ГБ.
Код: plsql
1.
2.
3.
4.
5.
6.
> diff tst3.log tst2.log
Binary files tst3.log and tst2.log differ

> cmp -b -l tst2.log tst3.log
31  60 0     61 1
cmp: EOF on tst3.log





Добавляем строку с текстом "Finished" в небольшой файл, т.е.
делаем ровно то, что делал скрипт, генерирующий большой файл,
но результат иной(файл остается небольшим):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
> echo "Finished" >> tst3.log

> ll tst3.log
-rw-r--r-- 1 oracle dba 41 Jul 22 11:47 tst3.log

> 
> 
> cat tst3.log
22-JUL-21

Elapsed: 00:00:00.00
Finished
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085298
Keklik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл добавить вывод hexdump после создания файлов, hexdump видит Finished
в большом файле:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
> ll tst*log

-rw-r--r-- 1 oracle dba         32 Jul 22 12:03 tst3.log
-rw-r--r-- 1 oracle dba 1498394666 Jul 22 12:28 tst2.log


> hexdump -C tst2.log | more
00000000  32 32 2d 4a 55 4c 2d 32  31 0a 0a 45 6c 61 70 73  |22-JUL-21..Elaps|
00000010  65 64 3a 20 30 30 3a 30  30 3a 30 30 2e 30 30 0a  |ed: 00:00:00.00.|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
594fb020  00 46 69 6e 69 73 68 65  64 0a                    |.Finished.|
594fb02a


> hexdump -C  tst3.log  | more
00000000  32 32 2d 4a 55 4c 2d 32  31 0a 0a 45 6c 61 70 73  |22-JUL-21..Elaps|
00000010  65 64 3a 20 30 30 3a 30  30 3a 30 30 2e 30 31 0a  |ed: 00:00:00.01.|
00000020
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085306
Мутаген
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы начал не c
Код: plaintext
which sqlplus
, а с
Код: plaintext
type echo
. Это должен быть shell builtin, но там ksh...

Затем поменял
Код: plaintext
export PATH=$ORACLE_HOME/bin:$PATH
на
Код: plaintext
export PATH=$PATH:$ORACLE_HOME/bin
и убрал LD_LIBRARY_PATH с LIBHOME. Если это не Instant client, он будет правильно пролинкован при инсталяции и эти переменые не нужны. LIBPATH точно не нужен никогда

И продолжил бы выбрасыванием запуска sqlplus из скрипта вообще, оставив внутри один echo, потом добавив второй echo в начало скрипта (echo started; echo finished)

Вообще, перенаправления stdout (>) в этой ситуации делает вызывающий shell, и надо в нём разбираться - почему он делает в некоторых случаях sparse файл. Т.е., stdout пишется, потом делается seek на 1.5 ГБ и пишется stdout остальной.

Невиданная дичь
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085322
Keklik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Переменные там вообще не нужны, ибо среда настроена на 32-битного клиента.
Добавил, чтобы вопросов меньше было по окружению.
И использовал для запуска в 64-битном клиенте(где ошибки нет).


Я сразу проверил версию без sqlplus, причем из двух
ШЕЛЛов (tcsh и ksh) - не делает два echo sparse-файла:


Код: 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.
> echo $SHELL
/bin/ksh

> type echo
echo is an alias for '/bin/echo -e'



> cat tst4.ksh
#!/bin/ksh 


#export ORACLE_HOME=/oravl01/oracle/19.3_32

#export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

#export LIBHOME=/oravl01/oracle/19.3_32/lib


#export PATH=$ORACLE_HOME/bin:$PATH

type echo

echo "Started"

echo "Finished"

exit 0



> ./tst4.ksh > tst4.log

> ll tst4.log
-rw-r--r-- 1 tlgwrk21 aimsys 41 Jul 22 13:38 tst4.log


> cat tst4.log
echo is a shell builtin
Started
Finished
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085338
Keklik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МутагенТ.е., stdout пишется, потом делается seek на 1.5 ГБ и пишется stdout остальной.
Спасибо за советы, да, именно так, запись в начале файла(вывод sqlplus), потом пустые 1.5ГБ, и потом хвост.
В примере ниже хвост - это результат работы команд после блока sqlplus:

Код: plsql
1.
2.
type echo
echo 'Finished'



Вот с какой стороны то, что с 64битным клиентом всё это работает без чудес с размерами
вывода stdout?



На 12с, 32-bit такая же история.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
> type echo
echo is an alias for '/bin/echo -e'

> echo $ORACLE_HOME
/oravl01/oracle/12.2.0.1_32

> which sqlplus
/oravl01/oracle/12.2.0.1_32/bin/sqlplus


> file /oravl01/oracle/12.2.0.1_32/bin/sqlplus
/oravl01/oracle/12.2.0.1_32/bin/sqlplus: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=d010344980bc21f707f8de3bd6d132c225f54581, not stripped



Закоментарил все переменные(они есть в окружении), добавил прямо в скрипт информацию
type echo, which sqlplus.... :
Код: 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.
> cat tst2.ksh
#!/bin/ksh 


#export ORACLE_HOME=/oravl01/oracle/19.3_32

#export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

#export LIBHOME=/oravl01/oracle/19.3_32/lib


#export PATH=$ORACLE_HOME/bin:$PATH

type echo

which sqlplus

file /oravl01/oracle/12.2.0.1_32/bin/sqlplus

echo $ORACLE_HOME

sqlplus -s testuser/testuser@TSTDB  << EOF
set echo on
set linesize 120
set timing on
set pagesize 0
select sysdate from dual;
exit
EOF

type echo
echo 'Finished'

exit 0





запускаем, получаем лог в 1.5ГБ:
Код: 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.
> ./tst2.ksh  > tst2.log



> ll tst2.log
-rw-r--r-- 1 tlgwrk21 aimsys 1489727875 Jul 22 13:51 tst2.log





> hexdump -C tst2.log | more

00000000  65 63 68 6f 20 69 73 20  61 20 73 68 65 6c 6c 20  |echo is a shell |
00000010  62 75 69 6c 74 69 6e 0a  2f 6f 72 61 76 6c 30 31  |builtin./oravl01|
00000020  2f 6f 72 61 63 6c 65 2f  31 32 2e 32 2e 30 2e 31  |/oracle/12.2.0.1|
00000030  5f 33 32 2f 62 69 6e 2f  73 71 6c 70 6c 75 73 0a  |_32/bin/sqlplus.|
00000040  2f 6f 72 61 76 6c 30 31  2f 6f 72 61 63 6c 65 2f  |/oravl01/oracle/|
00000050  31 32 2e 32 2e 30 2e 31  5f 33 32 2f 62 69 6e 2f  |12.2.0.1_32/bin/|
00000060  73 71 6c 70 6c 75 73 3a  20 45 4c 46 20 33 32 2d  |sqlplus: ELF 32-|
00000070  62 69 74 20 4c 53 42 20  65 78 65 63 75 74 61 62  |bit LSB executab|
00000080  6c 65 2c 20 49 6e 74 65  6c 20 38 30 33 38 36 2c  |le, Intel 80386,|
00000090  20 76 65 72 73 69 6f 6e  20 31 20 28 53 59 53 56  | version 1 (SYSV|
000000a0  29 2c 20 64 79 6e 61 6d  69 63 61 6c 6c 79 20 6c  |), dynamically l|
000000b0  69 6e 6b 65 64 20 28 75  73 65 73 20 73 68 61 72  |inked (uses shar|
000000c0  65 64 20 6c 69 62 73 29  2c 20 66 6f 72 20 47 4e  |ed libs), for GN|
000000d0  55 2f 4c 69 6e 75 78 20  32 2e 36 2e 33 32 2c 20  |U/Linux 2.6.32, |
000000e0  42 75 69 6c 64 49 44 5b  73 68 61 31 5d 3d 64 30  |BuildID[sha1]=d0|
000000f0  31 30 33 34 34 39 38 30  62 63 32 31 66 37 30 37  |10344980bc21f707|
00000100  66 38 64 65 33 62 64 36  64 31 33 32 63 32 32 35  |f8de3bd6d132c225|
00000110  66 35 34 35 38 31 2c 20  6e 6f 74 20 73 74 72 69  |f54581, not stri|
00000120  70 70 65 64 0a 2f 6f 72  61 76 6c 30 31 2f 6f 72  |pped./oravl01/or|
00000130  61 63 6c 65 2f 31 32 2e  32 2e 30 2e 31 5f 33 32  |acle/12.2.0.1_32|
00000140  0a 32 32 2d 4a 55 4c 2d  32 31 0a 0a 45 6c 61 70  |.22-JUL-21..Elap|
00000150  73 65 64 3a 20 30 30 3a  30 30 3a 30 30 2e 30 30  |sed: 00:00:00.00|
00000160  0a 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000170  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
58cb7160  00 00 65 63 68 6f 20 69  73 20 61 20 73 68 65 6c  |..echo is a shel|
58cb7170  6c 20 62 75 69 6c 74 69  6e 0a 46 69 6e 69 73 68  |l builtin.Finish|
58cb7180  65 64 0a                                          |ed.|
58cb7183
...
Рейтинг: 0 / 0
Shell скрипт формирует большой размер лога 32-битного sqlplus
    #40085766
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вызовите вместо SQL*Plus что-то другое 32-битное
- связанное c Oracle. Например, tnsping и opatch
- нечто никак не связанное с Oracle.
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Shell скрипт формирует большой размер лога 32-битного sqlplus
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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