понедельник, 31 октября 2011 г.

Использование raw раздела для InnoDB

Преимущество использования raw раздела:

  • Табличное пространство может занимать все пространство в разделе, без ограничений накладываемых в виде максимального размера файла в ОС
  • Снижение фрагментации
  • Снижение нагрузки из-за отсутствия уровня управления ФС
(ОС: Debian 6.0 x64)

Создаем целевой раздел, например логический том объемом в 984Мб

lvcreate -L984M -n innodb_data main

Выполняем бэкап всех баз данных, удаляем все БД с InnoDB таблицами и прописываем в конфиг Mysql сервера следующее

[mysqld]
innodb_data_home_dir = 
innodb_data_file_path = /dev/main/innodb_data:984Mnewraw

добавляем системного пользователя mysql в группу disk, чтобы Mysql сервер мог получить доступ к raw разделу

gpasswd -a mysql disk

останавливаем сервер, удаляем все файлы ibdata и ib_logfile, запускаем Mysql сервер, при запуске сервера раздел /dev/main/innodb_data проинициализируется, после чего обратно выключаем Mysql сервер

во время инициализации в логах будет что то подобное (init скрипт при запуске Mysql может вернуть ошибку, но на это не надо обращать внимания, так как сервер все равно запуститься и будет подготавливать себе raw раздел, немного подскочит нагрузка на дисковую подсистему, ждем пока завершится инициализация)

Oct 31 12:55:46 srv mysqld: InnoDB: The first specified data file /dev/main/innodb_data did not exist:
Oct 31 12:55:46 srv mysqld: InnoDB: a new database to be created!
Oct 31 12:55:46 srv mysqld: 111031 12:55:46  InnoDB: Setting file /dev/main/innodb_data size to 984 MB
Oct 31 12:55:46 srv mysqld: InnoDB: Database physically writes the file full: wait...
Oct 31 12:56:18 srv mysqld: InnoDB: Progress in MB: 100 200 300 400 500 600 700 800 900

Открываем конфиг и меняем newraw на raw

[mysqld]
innodb_data_home_dir = 
innodb_data_file_path = /dev/main/innodb_data:984Mraw

Запускаем Mysql сервер и заливаем наши базы обратно.

Не забываем что параметр innodb_file_per_table = 1 в конфиг.файле my.cnf не должен использоваться, чтобы данные базы не выносились в .ibd файлы в каталог базы данных /var/lib/mysql/<имя_базы>/ (путь используемый MySQL сервером по умолчанию). Иначе мы не получим ощутимого эффекта от использования raw раздела.

воскресенье, 30 октября 2011 г.

LVM


Базовые команды
Отобразить информацию о группах томов и логических разделах
vgidisplay --verbose
Увеличение LVM раздела
Пример увеличения логического раздела LogVol01 на 450Мб
lvextended -L+450M /dev/VolGroup00/LogVol01
Увеличение логического раздела LogVol01 до 12Гб
lvextended -L12G /dev/VolGroup00/LogVol01
После чего необходимо увеличить файловую систему на этом логическом разделе (в данном примере LogVol01 это корневая ФС и операция выполнена наживую)
rezise2fs /dev/VolGroup00/LogVol01
Уменьшение LVM раздела
ПЕРЕД УМЕНЬШЕНИЕМ ЛОГИЧЕСКОГО РАЗДЕЛА НЕОБХОДИМО СНАЧАЛА УМЕНЬШИТЬ РАЗМЕР ФАЙЛОВОЙ СИСТЕМЫ, ИНАЧЕ ВСЕ ДАННЫЕ НА РАЗДЕЛЕ БУДУТ ПОТЕРЯНЫ
Уменьшаем размер ФС на 2Гб (т.е. указываем новый размер ФС, в примере корень = 4Гб), потом уменьшаем размер LVM раздела на 1G (это пример, поэтому действуем грубо)
rezise2fs /dev/VolGroup00/VogVol01 2G
lvreduce -L-1G /dev/VolGroup00/LogVol01
Для уменьшения корневого раздела потребуется загрузиться в rescue mode и выполнить:
Отмонтируем нашу систему
umount -l /mnt/sysimage
Проверяем логический раздел, целевой
e2fsck -f /dev/VolGroup00/LogVol00
Уменьшаем размер ФС до требуемого размера
resize2fs /dev/VolGroup/LogVol00 1G
Уменьшаем размер логического LVM раздела
lvm
lvm > lvresize --size 1100M /dev/VolGroup00/LogVol00
lvm > ... (отвечаем "yes")
Перезагружаемся в нормальный режим.
Создание нового логического LVM раздела
lvcreate -L1500 -n LogVolData VolGroup00
где LogVolData это имя нового раздела, а VolGroup00 имя группы томов
Создаем ФС
mkfs.ext3 /dev/VolGroup00/LogVolData
Так же вместо Мб и Гб при работе с разделами можно указывать процентное соотношение, пример
lvcreate -l 100%FREE -n LogVolData VolGroup00

Почистить файл от комментариев

При работе с длинными конфигами с большим количество комментариев, иногда для быстрого вкуривания происходящего в конфиге бывает полезно опустить все комментарии и увидеть конфиг в максимально сокращенном виде, это можно сделать так:


cat /etc/mysql/my.cnf | grep -v '^#' | sed '/^$/d' > /etc/mysql/my.cnf_without_comments.cnf

четверг, 27 октября 2011 г.

Запрет запуска PHP скриптов из определенного каталога

Для веб-сервера Nginx

Защита каталога uploads, открываем конфигурационный файл целевого виртуального хоста Nginx и прописываем строчку

 if ($uri !~ "^/uploads/") { перед fastcgi_pass 127.0.0.1:9000;

Примерно вот так это должно выглядеть


location ~* \.php { if ($uri !~ "^/uploads/") { fastcgi_pass 127.0.0.1:9000; } fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; include fastcgi_params; }

среда, 12 октября 2011 г.

Переключение с MyISAM на InnoDB

Пример:

Смотрим текущий используемый движок для таблиц базы db2

root@django:~# mysql -u root -p -e 'select table_schema, table_name, engine from information_schema.tables where table_schema = "db2";'

+--------------+----------------------------+--------+
| table_schema | table_name                 | engine |
+--------------+----------------------------+--------+
| db2          | auth_group                 | MyISAM |
| db2          | auth_group_permissions     | MyISAM |
| db2          | auth_message               | MyISAM |
| db2          | auth_permission            | MyISAM |
| db2          | auth_user                  | MyISAM |
| db2          | auth_user_groups           | MyISAM |
| db2          | auth_user_user_permissions | MyISAM |
| db2          | django_admin_log           | MyISAM |
| db2          | django_content_type        | MyISAM |
| db2          | django_session             | MyISAM |
| db2          | django_site                | MyISAM |
+--------------+----------------------------+--------+

Переводим на InnoDB

root@django:~# mysql --skip-column-names -u root -ppassword -e 'select concat("alter table ",table_schema,".",table_name," engine=innodb;") from information_schema.tables where table_schema="db2"' | mysql -u root -p

Проверяем результат

root@django:~# mysql -u root -p -e 'select table_schema, table_name, engine from information_schema.tables where table_schema = "db2";'                                                            
+--------------+----------------------------+--------+
| table_schema | table_name                 | engine |
+--------------+----------------------------+--------+
| db2          | auth_group                 | InnoDB |
| db2          | auth_group_permissions     | InnoDB |
| db2          | auth_message               | InnoDB |
| db2          | auth_permission            | InnoDB |
| db2          | auth_user                  | InnoDB |
| db2          | auth_user_groups           | InnoDB |
| db2          | auth_user_user_permissions | InnoDB |
| db2          | django_admin_log           | InnoDB |
| db2          | django_content_type        | InnoDB |
| db2          | django_session             | InnoDB |
| db2          | django_site                | InnoDB |
+--------------+----------------------------+--------+

Соответственно поправив SQL запрос можно будет переключиться и в обратную сторону, т.е. с InnoDB на MyISAM

среда, 5 октября 2011 г.

Конвертирование почтового ящика из формата mbox в maildir

Ставим утилиту mb2md

apt-get install mb2md

Пример конвертирования одиночного почтового ящика формата mbox в ящик формата maildir

srv-01:/var/spool/mail# mb2md -s /var/spool/mail/virtuser_1012 -d /var/spool/mail/maildir_virtuser_1012
Converting /var/spool/mail/virtuser_1012 to maildir: /var/spool/mail/maildir_virtuser_1012
Source Mbox is /var/spool/mail/virtuser_1012
Target Maildir is /var/spool/mail/maildir_virtuser_1012
116 messages.