|
|
|
Вынесение табличного пространства TEMP на виртуальный диск
|
|||
|---|---|---|---|
|
#18+
Купил заказчик машинку с 1ТБ ОЗУ!!! БД использует порядка 300ГБ памяти и адвайзеры говорят что смысла её увеличивать нет. А дело ещё в том что прикладная система у меня очень сильно использует всяческие темповые таблицы. Так исторически сложилось, что сначала система была на информиксе а у него темповые таблицы лежат действительно в памяти, и там это всё понятно летает. Потом когда то мигрировали на Oracle и эту методику продолжили применять, не учитывая что в Oracle временные таблицы лежат во временном же ТП, а оно в свою очередь на диске. В итоге это совсем не быстро и так или иначе вызывает физический В/ВВ. Учитывая это появился великий соблазн создать на неиспользуемой памяти виртуальный диск а на нём разместить временное табличное пространство. Поискал, и ничего нигде не нашол кроме статьи о подобной задаче на солярисе. Честно говоря мне это ничего не дало так как у меня Sles 11 и Oracle 10. Попробовал я разные варианты монтирования Код: plsql 1. 2. 3. 4. 5. 6. 7. Естественно Код: plsql 1. 2. Потом пытаюсь создать ТП, и получаю фигвам : Код: plsql 1. 2. 3. 4. 5. 6. 7. Тут я просто обычное ТП создавал, для TEMP тоже самое. Последние 3 маунта вызывают ошибку типа нет доступа, хотя владелец oracle и права на каталог 777. Короче, никакими плясками с бубном, напрямую решить эту задачу не получилось. Получилось несколько кривым способом. Пришлось использовать самый старый тип виртуального диска в Linux - ramdisk. Сначала загрузил модуль brd.ko Код: plsql 1. Тут у меня : rd_nr=1 - один диск rd_size=2097152 - 2ГБ max_part=1 - один раздел на устройстве Проверил что устройство появилось Код: plsql 1. 2. 3. 4. Затем разбил его fdisk-ом. Правда он сначала захотел исправить исходную таблицу, и только потом всё прошло хорошо. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Затем отформатировал Код: plsql 1. И в конце смонтировал как обычно : Код: plsql 1. И только после этого создание ТП прошло нормально. Желаемого результата я добился, но как то это не элегантно. Нужно скрипты писать по автоматизации этих приседаний. Может кто то знает более красивое и простое решение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2017, 19:28 |
|
||
|
Вынесение табличного пространства TEMP на виртуальный диск
|
|||
|---|---|---|---|
|
#18+
в линуксах есть замечательная утилита strace, которая вам покажет и расскажет что там за Invalid argument или что с правами может у вас какой direct_io мешает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2017, 19:35 |
|
||
|
Вынесение табличного пространства TEMP на виртуальный диск
|
|||
|---|---|---|---|
|
#18+
VDomМожет кто то знает более красивое и простое решение? Если у тебя таблицы темповые, то почему ты пытаешься создать не TEMP тейблспейс, а обычный? CREATE GLOBAL TEMPORARY TABLE уже изучен? тем более, в твоем варианте после рестарта сервера твой тейблспейс станет недоступным и база просто так не стартует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2017, 20:16 |
|
||
|
Вынесение табличного пространства TEMP на виртуальный диск
|
|||
|---|---|---|---|
|
#18+
DВАв линуксах есть замечательная утилита strace, которая вам покажет и расскажет что там за Invalid argument или что с правами может у вас какой direct_io мешает таки так, Код: plsql 1. 2. 3. решает проблему, которая вплоть до 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2017, 20:56 |
|
||
|
Вынесение табличного пространства TEMP на виртуальный диск
|
|||
|---|---|---|---|
|
#18+
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. Ни разу не админ. Могу ошибаться во всем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2017, 01:56 |
|
||
|
Вынесение табличного пространства TEMP на виртуальный диск
|
|||
|---|---|---|---|
|
#18+
dbpatchЕсли у тебя таблицы темповые, то почему ты пытаешься создать не TEMP тейблспейс, а обычный? FYI VDomТут я просто обычное ТП создавал, для TEMP тоже самое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2017, 08:00 |
|
||
|
Вынесение табличного пространства TEMP на виртуальный диск
|
|||
|---|---|---|---|
|
#18+
Спасибо коллеги кто откликнулся. Я не зря подозревал что есть более изящный способ. На решение навел поиск в гугле по ORA-27040: Linux-x86_64 Error: 22: Invalid argument Оказалось что такая ошибка возникала у людей с любыми файловыми системами, при работе с rman или datapump. Тут уже указывали на решение этой проблемы - это параметр FILESYSTEMIO_OPTIONS. Я правда выполнил Код: sql 1. Перегрузил БД и вуаля - всё прошло во всех 3 вариантах : Код: plsql 1. 2. 3. То есть не надо никаких плясок с бубном, достаточно только в fstab дописать Код: plsql 1. Более того никаких плясок с бубном не надо делать и в Oracle. Это можно проверить даже на обычной FS. Я когда игрался, сделал temporary tablespace aaaa из нескольких файлов, при этом сделал его дефаултным. Делаем Код: plsql 1. (иммитируем пропадание сети) Затем удаляем файлы ВРЕМЕННОГО (только TEMPORARY ТП) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. А затем как обычно стартуем БД : Код: plsql 1. И вот что видим в alert.log : Код: plsql 1. 2. 3. 4. 5. 6. Смотрим что же есть на диске : Код: plsql 1. 2. 3. 4. 5. 6. 7. Так что спокойно можно выносить TEMP на виртуальный диск, тем у кого достаточно для этого памяти. Теперь пару слов о темповых ТП вообще. Как известно они используются для всяческих сортировок сессиями если sort_area_size для этого не хватает. Так же в них находятся данные временных таблиц. Большие темповые таблички точно лежат в темповом ТП. Не знаю у кого, как а мои программеры черезвычайно любят использовать темповые таблицы. Чего то в них инсертят затем с чем то клеят и т.д. и т.п. Поэтому нагрузка на темповое табличное пространство у меня налицо. Более того значительная доля В/ВВ связанна именно с темповым табличным пространством. Это специфика моей системы. Вполне может быть что у большинства такого явления не наблюдается. Посему это должно быть интересно тем у кого ситуация близка к моей. У меня постоянно в топе запросы использующие темповые таблицы (обычно это целая пачка таблиц включая темповые). Ускорение В/ВВ связанное с темповым ТП сразу ускоряет работу системы в целом. Я это проверил вынесением темпа на SSD, теперь вынесу в ОЗУ, что значительно лучше во всех отношениях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2017, 13:55 |
|
||
|
Вынесение табличного пространства TEMP на виртуальный диск
|
|||
|---|---|---|---|
|
#18+
VDomЯ правда выполнил Код: sql 1. Ната справедливо заметила, что виноник 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... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2017, 14:47 |
|
||
|
Вынесение табличного пространства TEMP на виртуальный диск
|
|||
|---|---|---|---|
|
#18+
dbpatchа вот то, что запись в TEMPORARY TABLE генерит REDO/UNDO - вот это конечно странно, Oracle такой блин Oracle... а чего странного? любая транзакция, использующая временную таблицу имеет полное право откатиться, а не ругаться на ролбэк "ой бл а я-то данные отката и не сохранила". До 12 версии использовался общий механизм, в 12 слегка оптимизировали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2017, 15:12 |
|
||
|
Вынесение табличного пространства TEMP на виртуальный диск
|
|||
|---|---|---|---|
|
#18+
dbpatchДа, и это вполне документированная фича. TEMP тейблспейсы вполне можно располагать в /tmp, терять и пересоздавать каждый раз при рестарте.... Спасибо. Я об этом даже не подозревал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2017, 15:38 |
|
||
|
Вынесение табличного пространства TEMP на виртуальный диск
|
|||
|---|---|---|---|
|
#18+
DВАdbpatchа вот то, что запись в TEMPORARY TABLE генерит REDO/UNDO - вот это конечно странно, Oracle такой блин Oracle... а чего странного? любая транзакция, использующая временную таблицу имеет полное право откатиться, а не ругаться на ролбэк "ой бл а я-то данные отката и не сохранила". До 12 версии использовался общий механизм, в 12 слегка оптимизировали странно то, что изначально не сделали то, что сделали в 12м - UNDO серменты в TEMP, без необходимости обеспечения возможности recovery самой UNDO TABLESPACE ну и в целом - full ACID для TEMPORARY TABLE это немного перебор, они же видны только текущей сессии, зачем там это все благолепие с откатами? могли бы и просто NONTRANSACTIONAL опцию запилить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2017, 16:18 |
|
||
|
Вынесение табличного пространства TEMP на виртуальный диск
|
|||
|---|---|---|---|
|
#18+
dbpatchстранно то, что изначально не сделали то, что сделали в 12м - UNDO серменты в TEMP, без необходимости обеспечения возможности recovery самой UNDO TABLESPACE Допускаю, что мог неправильно понять, но в темпе хранятся только анду сегменты для темп-объектов, необходимость обеспечивать рекавери нормального анду никто, очевидно, не отменял... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2017, 16:27 |
|
||
|
Вынесение табличного пространства TEMP на виртуальный диск
|
|||
|---|---|---|---|
|
#18+
проходил мимо...dbpatchстранно то, что изначально не сделали то, что сделали в 12м - UNDO серменты в TEMP, без необходимости обеспечения возможности recovery самой UNDO TABLESPACE Допускаю, что мог неправильно понять, но в темпе хранятся только анду сегменты для темп-объектов, необходимость обеспечивать рекавери нормального анду никто, очевидно, не отменял... да чего там гадать-то, все вполне доходчиво документировано https://docs.oracle.com/database/121/ADMIN/undo.htm#ADMIN13740 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2017, 16:47 |
|
||
|
Вынесение табличного пространства TEMP на виртуальный диск
|
|||
|---|---|---|---|
|
#18+
Добрый день коллеги. Рад что эта тема многих заинтересовала. Могу добавить только следующее. 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 Может название не совсем правильное, но странности с темповыми таблицами у меня имеются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2017, 13:05 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39491617&tid=1885571]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
152ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 428ms |

| 0 / 0 |
