SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 31.08.2012 21:33:53

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Буферизация строки в оперативной памяти

Есть большая таблица, в основном из blob'ов. В этой таблице каждая строка хранит данные за час работы сервера. В неё постоянно сбрасываются обновленные данные (~ каждые 2 минуты). Так как ценность этих данных низкая - чтобы сервак постоянно не вис от перегрузки винча, нужно буферизировать эти данные в оператню, и на винчестер скидывать только в конце каждого часа.
Я вижу два варианта:
1) Сделать дубликат этой таблицы в оперативной памяти (назовем её RAM таблицей), заполнять её данными и в конце каждого часа переносить данные из этой RAM таблицы в обычную таблицу. Но возможно ли указывать пути расположение для разных таблиц одной базы по отдельности?
2) Разделить таблицу на две партиции (по определенному индексу, ключу), одна на винчестере, дургая на RAM drive... и смена ключа в строке в конце часа должна автоматически переносить данные из RAM партиции в партицию на жестком диске. Тоже не понятно, можно ли указывать отдельные пути для партицый одной таблицы?

Собственно говоря не представляю возможен ли хотябы один из данных вариантов... Подскажите правильное решение

ОС: Ubuntu
Тип таблицы MyISAM, но могу сменить на InnoDB

Неактивен

 

#2 31.08.2012 21:43:03

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Буферизация строки в оперативной памяти

Если вам подойдут таблицы типа MEMORY, то они решат задачу хранения некоторых таблиц в памяти. Потом данные сожно перенести в основную таблицу в несколько шагов:
1) приостановить поступление данных в MEMORY-таблицу M
2) переименовать MEMORY-таблицу M в M1
3) создать пустую таблицу M и возобновить вставку данных
4) вставить данные из M1 в таблицу на диске INSERT INTO D SELECT * FROM M1;
5) DROP TABLE M1;

Неактивен

 

#3 31.08.2012 22:43:04

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: Буферизация строки в оперативной памяти

К сожалению не подойдет, у меня таблица из blob'ов, а до них разработчики её не добрались.  Т.ч. ябы с радостью не строил велосипед, еслиб готовый вариант не был на столько сырой...
Насчет переноса, у меня в архитектуре приложения всё заложено, перенести данные из одной таблицы в другую не проблема, если таблицы в одной базе
Скажете что-нибудь про мои варианты?

Отредактированно gif-t (31.08.2012 22:48:31)

Неактивен

 

#4 31.08.2012 22:58:41

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Буферизация строки в оперативной памяти

Кстати, в Percona Server blob-ы поддерживаются в MEMORY:
http://www.percona.com/doc/percona-serv … ory_engine

То, что вы предлагаете можно сделать символическими ссылками
*) создать таблицу MYISAM
*) перенести файлы в директорию, хранящуюся на RAM-диске
*) на исходном место создать символические ссылки (MySQL их понимает)

То же самое можно сделать с PARTITION - каждый раздел это отдельный файл, его можно таким же путем перенести.

Неактивен

 

#5 31.08.2012 23:07:39

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: Буферизация строки в оперативной памяти

Спасибо, попробую

Неактивен

 

#6 31.08.2012 23:33:13

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: Буферизация строки в оперативной памяти

В MyISAM в случае отдельной таблицы при записи блокироваться будет только она. А если использовать партиции, будет блокироваться только та партиция, в которую происходит запись или все партиции в таблице, т.е. вся таблица целиком?
И в целом, что вы посоветуете, сделать отдельную таблицу на одну строку, или партицию?

Отредактированно gif-t (01.09.2012 00:10:53)

Неактивен

 

#7 01.09.2012 01:37:00

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Буферизация строки в оперативной памяти

В MyISAM всегда происходит блокировка всей таблицы (до еще не стабильной версии 5.6.6 http://dev.mysql.com/doc/refman/5.6/en/ … cking.html ).

Отдельная таблица или партиция это ваш выбор - он зависит от архитектуры приложения. Отдельная таблица будет проще в администрировании и позволит избежать лишних блокировок.

Неактивен

 

#8 01.09.2012 21:00:18

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: Буферизация строки в оперативной памяти

Добрый вечер.
Создал символическую ссылку вручную - что-то не заработало...
Решил создать их как пологается через ALTER TABLE, но выскакивает ошибка:

1 - Can't create/write to file '/media/ramdrive/#sql-415_d2#P#ram.MYI' (Errcode: 13)

Это ошибка отсутствия прав доступа.
Пробовал разные папки, везде возникает эта ошибка. Единственная директория, в которой заработало, это /tmp
Сравнил права доступа  между /tmp и /media/ramdrive - они оказались идентичны.
Пробовал также права 1777 и разных пользователей, включая MySQL
Может быть для MySQL где-то необходимо прописать "разрешенные" каталоги? Или какие-то настроки не позволяют?

Неактивен

 

#9 01.09.2012 21:48:18

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Буферизация строки в оперативной памяти

Это странно. Попробуйте под рутом сделать
su mysql
и затем сделать
cd /media/ramdrive
touch test.txt

Думаю, что дело в том, что пользователь mysql не имеет прав, например войти в директорию или создавать там файлы.

Неактивен

 

#10 06.09.2012 19:28:02

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: Буферизация строки в оперативной памяти

Разобрался. Решение было не так просто найти, оно нигде не описано...
В ubuntu по умолчанию используется apparmor, увеличивающий степень защиты системы. Он хранит профили пользователей, и разрешает/запрещает им обращаться в те или иные директории. В профиле настроек mysql соответственно запрещен доступ в новое месторасположение файлов.
Если MySQL пишет что-то типо:

Can't create/write to file '...' (Errcode: 13)

но при этом все права на папку/файлы выставлены, открываем файл

/etc/apparmor.d/usr.sbin.mysqld

и дописываем в его конец новую директорию, чтобы получилось так:

/sys/devices/system/cpu/ r,
  /новая директория/** rw,
}

Нужно обратить внимание, что если переносится папка базы данных, то нужно прописать несколько строчек. В данном файле уже присутствуют строки для директории баз по умолчанию, - нужно разобраться и прописать строки с новой директорией по аналогии.
После внесения изменений перезапускаем командой:

sudo service apparmor restart

теперь mysql сможет записать все необходимые файлы

Отредактированно gif-t (06.09.2012 19:33:23)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson