powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вынесение табличного пространства TEMP на виртуальный диск
14 сообщений из 14, страница 1 из 1
Вынесение табличного пространства TEMP на виртуальный диск
    #39491145
VDom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Купил заказчик машинку с 1ТБ ОЗУ!!! БД использует порядка 300ГБ памяти и адвайзеры говорят что смысла её увеличивать нет. А дело ещё в том что прикладная система у меня очень сильно использует всяческие темповые таблицы. Так исторически сложилось, что сначала система была на информиксе а у него темповые таблицы лежат действительно в памяти, и там это всё понятно летает. Потом когда то мигрировали на Oracle и эту методику продолжили применять, не учитывая что в Oracle временные таблицы лежат во временном же ТП, а оно в свою очередь на диске. В итоге это совсем не быстро и так или иначе вызывает физический В/ВВ. Учитывая это появился великий соблазн создать на неиспользуемой памяти виртуальный диск а на нём разместить временное табличное пространство. Поискал, и ничего нигде не нашол кроме статьи о подобной задаче на солярисе. Честно говоря мне это ничего не дало так как у меня Sles 11 и Oracle 10.

Попробовал я разные варианты монтирования
Код: plsql
1.
2.
3.
4.
5.
6.
7.
mount -t tmpfs -o size=2G tmpfs /oratempfs/
mount -t tmpfs -o size=2G ramfs /oratempfs/
mount -t tmpfs -o size=2G ext4  /oratempfs/

mount -t ramfs -o size=2G tmpfs /oratempfs/
mount -t ramfs -o size=2G ramfs /oratempfs/
mount -t ramfs -o size=2G ext4  /oratempfs/


Естественно
Код: plsql
1.
2.
chown oracle:oinstall /oratempfs
chmod 777 /oratempfs



Потом пытаюсь создать ТП, и получаю фигвам :
Код: plsql
1.
2.
3.
4.
5.
6.
7.
SQL> CREATE SMALLFILE TABLESPACE "AAAA" DATAFILE '/oratempfs/aaaa_01.dbf' SIZE 100M AUTOEXTEND ON NEXT 10K MAXSIZE UNLIMITED ;
CREATE SMALLFILE TABLESPACE "AAAA" DATAFILE '/oratempfs/aaaa_01.dbf' SIZE 100M AUTOEXTEND ON NEXT 10K MAXSIZE UNLIMITED
*
ERROR at line 1:
ORA-01119: error in creating database file '/oratempfs/aaaa_01.dbf'
ORA-27040: file create error, unable to create file
Linux-x86_64 Error: 22: Invalid argument



Тут я просто обычное ТП создавал, для TEMP тоже самое.
Последние 3 маунта вызывают ошибку типа нет доступа, хотя владелец oracle и права на каталог 777.

Короче, никакими плясками с бубном, напрямую решить эту задачу не получилось.

Получилось несколько кривым способом. Пришлось использовать самый старый тип виртуального диска в Linux - ramdisk.

Сначала загрузил модуль brd.ko
Код: plsql
1.
insmod /lib/modules/3.0.76-0.11-default/kernel/drivers/block/brd.ko rd_nr=1 rd_size=2097152 max_part=1


Тут у меня :
rd_nr=1 - один диск
rd_size=2097152 - 2ГБ
max_part=1 - один раздел на устройстве

Проверил что устройство появилось
Код: plsql
1.
2.
3.
4.
ls -la /dev/ | grep ram
crw-r-----   1 root kmem     10, 144 Jul 17 16:58 nvram
brw-rw----   1 root disk      1,   0 Jul 18 15:24 ram0
lrwxrwxrwx   1 root root           4 Jul 18 15:24 ramdisk -> ram0


Затем разбил его fdisk-ом. Правда он сначала захотел исправить исходную таблицу, и только потом всё прошло хорошо.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
oradev8:/ # fdisk /dev/ram0

Command (m for help): a
Partition number (1-4): 1
Warning: partition 1 has empty type

Command (m for help): p

Disk /dev/ram0: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders, total 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x369e9830

     Device Boot      Start         End      Blocks   Id  System
/dev/ram0p1   *           0           0           0    0  Empty

Command (m for help): q


Затем отформатировал
Код: plsql
1.
oradev8:/ # mkfs -T ext2 /dev/ram0


И в конце смонтировал как обычно :
Код: plsql
1.
mount /dev/ram0 /oratempfs


И только после этого создание ТП прошло нормально.

Желаемого результата я добился, но как то это не элегантно. Нужно скрипты писать по автоматизации этих приседаний.

Может кто то знает более красивое и простое решение?
...
Рейтинг: 0 / 0
Вынесение табличного пространства TEMP на виртуальный диск
    #39491152
Фотография DВА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в линуксах есть замечательная утилита strace, которая вам покажет и расскажет что там за Invalid argument или что с правами
может у вас какой direct_io мешает
...
Рейтинг: 0 / 0
Вынесение табличного пространства TEMP на виртуальный диск
    #39491171
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VDomМожет кто то знает более красивое и простое решение?

Если у тебя таблицы темповые, то почему ты пытаешься создать не TEMP тейблспейс, а обычный?

CREATE GLOBAL TEMPORARY TABLE уже изучен?
тем более, в твоем варианте после рестарта сервера твой тейблспейс станет недоступным и база просто так не стартует.
...
Рейтинг: 0 / 0
Вынесение табличного пространства TEMP на виртуальный диск
    #39491184
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DВАв линуксах есть замечательная утилита strace, которая вам покажет и расскажет что там за Invalid argument или что с правами
может у вас какой direct_io мешает

таки так,

Код: plsql
1.
2.
3.
ALTER SYSTEM SET filesystemio_options=none SCOPE=SPFILE;
SHUTDOWN IMMEDIATE
STARTUP


решает проблему, которая вплоть до 12.2 включительно успешно воспроизводится.


ТСу - Oracle GLOBAL TEMPORARY TABLE еще и redo/undo генерит, как ни странно, не только TEMP на диске дергает

см на TEMP_UNDO_ENABLED

http://oracle-rabadan.blogspot.de/2015/06/new-parameters-in-oracle-12c.html#!/2015/06/new-parameters-in-oracle-12c.html
...
Рейтинг: 0 / 0
Вынесение табличного пространства TEMP на виртуальный диск
    #39491263
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VDom...В итоге это совсем не быстро и так или иначе вызывает физический В/ВВ..
Вот это вроде и простая фраза, но мне совершенно не понятная:

Какой ввод/вывод. В табличное пространство, в redo log, в undo. Read или Write?

Если Read. Блоки темповых таблиц должны быть в Buffer Cache (раз памяти очень много) - т.е. Read'а с диска должно быть исчезающе мало... так почему "не быстро"?

Если Write. Write должен произойти только при сбросе dirty buffer из buffer cache. Это afaik или из-за нехватки места в Buffer Cache (но опять таки, памяти у нас много) и/или из-за checkout'ов и всего прочего (но это вроде настраивается).

В общем IMHO из "а оно в свою очередь на диске" отнюдь не следует "вызывает физический В/ВВ" (физический В/ВВ любой чих вызывает, вопрос насколько много этого ВВ) и "это совсем не быстро"

dbpatch...тем более, в твоем варианте после рестарта сервера твой тейблспейс станет недоступным и база просто так не стартует.

+100500
dbpatchALTER SYSTEM SET filesystemio_options=none SCOPE=SPFILE;
SHUTDOWN IMMEDIATE
STARTUP

решает проблему, которая вплоть до 12.2 включительно успешно воспроизводится.

А оно ее действительно решает?

Мне как то кажется, что от такого "решения" серверу вообще кирдык наступить может.

Если плохого танцора кастрировать, то он не только танцевать сразу лучше начнет (удалили ту часть тела, которая мешала))) ) но даже и в опере петь сможет. IMHO

IMHO. Ни разу не админ. Могу ошибаться во всем.
...
Рейтинг: 0 / 0
Вынесение табличного пространства TEMP на виртуальный диск
    #39491288
Фотография Viewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchЕсли у тебя таблицы темповые, то почему ты пытаешься создать не TEMP тейблспейс, а обычный?
FYI
VDomТут я просто обычное ТП создавал, для TEMP тоже самое.
...
Рейтинг: 0 / 0
Вынесение табличного пространства TEMP на виртуальный диск
    #39491575
VDom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо коллеги кто откликнулся.

Я не зря подозревал что есть более изящный способ.
На решение навел поиск в гугле по ORA-27040: Linux-x86_64 Error: 22: Invalid argument
Оказалось что такая ошибка возникала у людей с любыми файловыми системами, при работе с rman или datapump.
Тут уже указывали на решение этой проблемы - это параметр FILESYSTEMIO_OPTIONS.
Я правда выполнил
Код: sql
1.
alter system set FILESYSTEMIO_OPTIONS=asynch scope=spfile ;



Перегрузил БД и вуаля - всё прошло во всех 3 вариантах :
Код: plsql
1.
2.
3.
mount -t tmpfs -o size=100M tmpfs /oratempfs/
mount -t tmpfs -o size=100M ramfs /oratempfs/
mount -t tmpfs -o size=100M ext4  /oratempfs/


То есть не надо никаких плясок с бубном, достаточно только в fstab дописать
Код: plsql
1.
tmpfs                /oratempfs           tmpfs      rw,size=2G            0 0



Более того никаких плясок с бубном не надо делать и в Oracle.
Это можно проверить даже на обычной FS.
Я когда игрался, сделал temporary tablespace aaaa из нескольких файлов, при этом сделал его дефаултным.

Делаем
Код: plsql
1.
shutdown abort

(иммитируем пропадание сети)

Затем удаляем файлы ВРЕМЕННОГО (только TEMPORARY ТП)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
oradev8:/ # ll  /oratempfs
total 960
-rw-r----- 1 oracle oinstall 104865792 Jul 19 13:12 aaaa_01.dbf
-rw-r----- 1 oracle oinstall 104865792 Jul 19 13:12 aaaa_02.dbf
-rw-r----- 1 oracle oinstall 104865792 Jul 19 13:18 aaaa_03.dbf
-rw-r----- 1 oracle oinstall 104865792 Jul 19 13:18 aaaa_04.dbf
-rw-r----- 1 oracle oinstall 104865792 Jul 19 13:12 aaaa_06.dbf
oradev8:/ # rm  /oratempfs/*.*
oradev8:/ # ll  /oratempfs
total 0


А затем как обычно стартуем БД :
Код: plsql
1.
startup



И вот что видим в alert.log :
Код: plsql
1.
2.
3.
4.
5.
6.
Wed Jul 19 13:24:15 EEST 2017
Re-creating tempfile /oratempfs/aaaa_06.dbf
Re-creating tempfile /oratempfs/aaaa_04.dbf
Re-creating tempfile /oratempfs/aaaa_03.dbf
Re-creating tempfile /oratempfs/aaaa_02.dbf
Re-creating tempfile /oratempfs/aaaa_01.dbf


Смотрим что же есть на диске :
Код: plsql
1.
2.
3.
4.
5.
6.
7.
oradev8:/ # ll  /oratempfs
total 360
-rw-r----- 1 oracle oinstall 104865792 Jul 19 13:24 aaaa_01.dbf
-rw-r----- 1 oracle oinstall 104865792 Jul 19 13:24 aaaa_02.dbf
-rw-r----- 1 oracle oinstall 104865792 Jul 19 13:24 aaaa_03.dbf
-rw-r----- 1 oracle oinstall 104865792 Jul 19 13:24 aaaa_04.dbf
-rw-r----- 1 oracle oinstall 104865792 Jul 19 13:24 aaaa_06.dbf


Так что спокойно можно выносить TEMP на виртуальный диск, тем у кого достаточно для этого памяти.

Теперь пару слов о темповых ТП вообще. Как известно они используются для всяческих сортировок сессиями если sort_area_size для этого не хватает. Так же в них находятся данные временных таблиц. Большие темповые таблички точно лежат в темповом ТП. Не знаю у кого, как а мои программеры черезвычайно любят использовать темповые таблицы. Чего то в них инсертят затем с чем то клеят и т.д. и т.п. Поэтому нагрузка на темповое табличное пространство у меня налицо. Более того значительная доля В/ВВ связанна именно с темповым табличным пространством. Это специфика моей системы. Вполне может быть что у большинства такого явления не наблюдается. Посему это должно быть интересно тем у кого ситуация близка к моей.

У меня постоянно в топе запросы использующие темповые таблицы (обычно это целая пачка таблиц включая темповые). Ускорение В/ВВ связанное с темповым ТП сразу ускоряет работу системы в целом. Я это проверил вынесением темпа на SSD, теперь вынесу в ОЗУ, что значительно лучше во всех отношениях.
...
Рейтинг: 0 / 0
Вынесение табличного пространства TEMP на виртуальный диск
    #39491617
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VDomЯ правда выполнил
Код: sql
1.
alter system set FILESYSTEMIO_OPTIONS=asynch scope=spfile ;


Ната справедливо заметила, что виноник direct_io. async_io реализован в Oracle библиотечными средствами уровня userspaсe, не уровня ядра, потому его вполне можно применять к чему угодно.
Хотя смысла в этом async_io достаточно мало - операционные системы нонче достаточно грамотные, чтоб разобраться с конвееризацией i/o самостоятельно.

VDomТак что спокойно можно выносить TEMP на виртуальный диск, тем у кого достаточно для этого памяти.
Да, и это вполне документированная фича. TEMP тейблспейсы вполне можно располагать в /tmp, терять и пересоздавать каждый раз при рестарте. Правда большинство админов про это не знает и зачем-то не только лепит их на обычные диски (а то и на SAN-ы), да еще и реплицирует (на уровне SAN), и бекапит каждый раз.

VDomБолее того значительная доля В/ВВ связанна именно с темповым табличным пространством. Это специфика моей системы.

у тебя была специфика direct_io, в т.ч. и для TEMP, а у ленивых (у кого не настроен direct_io) ее нет потому у них запись TEMP фактически производится только в память, Oracle для TEMP не делает fsync() вызовы и сама операционка благополучно размещает это все в кеш памяти, если место есть.

Собственно ты выключил direct_io - теперь буфер O/S будет отвечать за TEMP данные, особого смысла в tmpfs тут нет - просто
кусок будет сидеть или в buffer cache или в shm или просто в swap

хотя нужно конечно посмотреть лишний раз - буферизируется ли запись в tmpfs или сразу идет в shm/swap

а вот то, что запись в TEMPORARY TABLE генерит REDO/UNDO - вот это конечно странно, Oracle такой блин Oracle...
...
Рейтинг: 0 / 0
Вынесение табличного пространства TEMP на виртуальный диск
    #39491648
Фотография DВА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchа вот то, что запись в TEMPORARY TABLE генерит REDO/UNDO - вот это конечно странно, Oracle такой блин Oracle...
а чего странного? любая транзакция, использующая временную таблицу имеет полное право откатиться, а не ругаться на ролбэк "ой бл а я-то данные отката и не сохранила". До 12 версии использовался общий механизм, в 12 слегка оптимизировали
...
Рейтинг: 0 / 0
Вынесение табличного пространства TEMP на виртуальный диск
    #39491689
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchДа, и это вполне документированная фича. TEMP тейблспейсы вполне можно располагать в /tmp, терять и пересоздавать каждый раз при рестарте....
Спасибо. Я об этом даже не подозревал
...
Рейтинг: 0 / 0
Вынесение табличного пространства TEMP на виртуальный диск
    #39491720
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DВАdbpatchа вот то, что запись в TEMPORARY TABLE генерит REDO/UNDO - вот это конечно странно, Oracle такой блин Oracle...
а чего странного? любая транзакция, использующая временную таблицу имеет полное право откатиться, а не ругаться на ролбэк "ой бл а я-то данные отката и не сохранила". До 12 версии использовался общий механизм, в 12 слегка оптимизировали

странно то, что изначально не сделали то, что сделали в 12м - UNDO серменты в TEMP, без необходимости обеспечения возможности recovery самой UNDO TABLESPACE


ну и в целом - full ACID для TEMPORARY TABLE это немного перебор, они же видны только текущей сессии, зачем там это все благолепие с откатами? могли бы и просто NONTRANSACTIONAL опцию запилить...
...
Рейтинг: 0 / 0
Вынесение табличного пространства TEMP на виртуальный диск
    #39491727
проходил мимо...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchстранно то, что изначально не сделали то, что сделали в 12м - UNDO серменты в TEMP, без необходимости обеспечения возможности recovery самой UNDO TABLESPACE
Допускаю, что мог неправильно понять, но в темпе хранятся только анду сегменты для темп-объектов, необходимость обеспечивать рекавери нормального анду никто, очевидно, не отменял...
...
Рейтинг: 0 / 0
Вынесение табличного пространства TEMP на виртуальный диск
    #39491743
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходил мимо...dbpatchстранно то, что изначально не сделали то, что сделали в 12м - UNDO серменты в TEMP, без необходимости обеспечения возможности recovery самой UNDO TABLESPACE
Допускаю, что мог неправильно понять, но в темпе хранятся только анду сегменты для темп-объектов, необходимость обеспечивать рекавери нормального анду никто, очевидно, не отменял...

да чего там гадать-то, все вполне доходчиво документировано

https://docs.oracle.com/database/121/ADMIN/undo.htm#ADMIN13740
...
Рейтинг: 0 / 0
Вынесение табличного пространства TEMP на виртуальный диск
    #39492307
VDom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день коллеги.

Рад что эта тема многих заинтересовала. Могу добавить только следующее.

dbpatchСобственно ты выключил direct_io - теперь буфер O/S будет отвечать за TEMP данные, особого смысла в tmpfs тут нет - просто
кусок будет сидеть или в buffer cache или в shm или просто в swap
У меня БД в ASM, поэтому filesystemio_options мне смысла устанавливать не было.

До 12 Oracle транзакции происходящие в TEMP писались в UNDO. Ничего с этим сделать было нельзя.

Ну и опять таки вынести TEMP на виртуальный диск, к сожалению могут только те у кого памяти много.
У меня например TEMP=128ГБ.
До того как появился 1ТБ памяти, я об этом даже не задумывался - и без этого было что в память поместить.

Кстати раз зашёл разговор о темповых таблицах открываю новую тему - "Странное поведение временных таблиц"
http://www.sql.ru/forum/1266547-a/strannoe-povedenie-vremennyh-tablic

Может название не совсем правильное, но странности с темповыми таблицами у меня имеются.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вынесение табличного пространства TEMP на виртуальный диск
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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