Задавайте вопросы, мы ответим
Вы не зашли.
Есть большая таблица, в основном из blob'ов. В этой таблице каждая строка хранит данные за час работы сервера. В неё постоянно сбрасываются обновленные данные (~ каждые 2 минуты). Так как ценность этих данных низкая - чтобы сервак постоянно не вис от перегрузки винча, нужно буферизировать эти данные в оператню, и на винчестер скидывать только в конце каждого часа.
Я вижу два варианта:
1) Сделать дубликат этой таблицы в оперативной памяти (назовем её RAM таблицей), заполнять её данными и в конце каждого часа переносить данные из этой RAM таблицы в обычную таблицу. Но возможно ли указывать пути расположение для разных таблиц одной базы по отдельности?
2) Разделить таблицу на две партиции (по определенному индексу, ключу), одна на винчестере, дургая на RAM drive... и смена ключа в строке в конце часа должна автоматически переносить данные из RAM партиции в партицию на жестком диске. Тоже не понятно, можно ли указывать отдельные пути для партицый одной таблицы?
Собственно говоря не представляю возможен ли хотябы один из данных вариантов... Подскажите правильное решение
ОС: Ubuntu
Тип таблицы MyISAM, но могу сменить на InnoDB
Неактивен
Если вам подойдут таблицы типа MEMORY, то они решат задачу хранения некоторых таблиц в памяти. Потом данные сожно перенести в основную таблицу в несколько шагов:
1) приостановить поступление данных в MEMORY-таблицу M
2) переименовать MEMORY-таблицу M в M1
3) создать пустую таблицу M и возобновить вставку данных
4) вставить данные из M1 в таблицу на диске INSERT INTO D SELECT * FROM M1;
5) DROP TABLE M1;
Неактивен
К сожалению не подойдет, у меня таблица из blob'ов, а до них разработчики её не добрались. Т.ч. ябы с радостью не строил велосипед, еслиб готовый вариант не был на столько сырой...
Насчет переноса, у меня в архитектуре приложения всё заложено, перенести данные из одной таблицы в другую не проблема, если таблицы в одной базе
Скажете что-нибудь про мои варианты?
Отредактированно gif-t (31.08.2012 22:48:31)
Неактивен
Кстати, в Percona Server blob-ы поддерживаются в MEMORY:
http://www.percona.com/doc/percona-serv … ory_engine
То, что вы предлагаете можно сделать символическими ссылками
*) создать таблицу MYISAM
*) перенести файлы в директорию, хранящуюся на RAM-диске
*) на исходном место создать символические ссылки (MySQL их понимает)
То же самое можно сделать с PARTITION - каждый раздел это отдельный файл, его можно таким же путем перенести.
Неактивен
Спасибо, попробую
Неактивен
В MyISAM в случае отдельной таблицы при записи блокироваться будет только она. А если использовать партиции, будет блокироваться только та партиция, в которую происходит запись или все партиции в таблице, т.е. вся таблица целиком?
И в целом, что вы посоветуете, сделать отдельную таблицу на одну строку, или партицию?
Отредактированно gif-t (01.09.2012 00:10:53)
Неактивен
В MyISAM всегда происходит блокировка всей таблицы (до еще не стабильной версии 5.6.6 http://dev.mysql.com/doc/refman/5.6/en/ … cking.html ).
Отдельная таблица или партиция это ваш выбор - он зависит от архитектуры приложения. Отдельная таблица будет проще в администрировании и позволит избежать лишних блокировок.
Неактивен
Добрый вечер.
Создал символическую ссылку вручную - что-то не заработало...
Решил создать их как пологается через 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 где-то необходимо прописать "разрешенные" каталоги? Или какие-то настроки не позволяют?
Неактивен
Это странно. Попробуйте под рутом сделать
su mysql
и затем сделать
cd /media/ramdrive
touch test.txt
Думаю, что дело в том, что пользователь mysql не имеет прав, например войти в директорию или создавать там файлы.
Неактивен
Разобрался. Решение было не так просто найти, оно нигде не описано...
В 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)
Неактивен