В данной статье рассмотрена установка MySQL на OpenBSD с установкой лимитов, конфигурацией класса mysql, небольшим тюнингом, сохранением\восстановлением базы и т.п.
Обновим порты под свой релиз OpenBSD и проверим текущую версию MySQL.
# cd /usr/ports/ # cvs -d anoncvs@ftp5.eu.openbsd.org:/cvs update -PdrOPENBSD_4_7 ~~~~ # make search name=mysql-server Port: mysql-server-5.1.42 Path: databases/mysql,-server Info: multithreaded SQL database (server) Maint: Brad Smith <brad@comstyle.com> Index: databases L-deps: mysqlclient:mysql-client->=5.1,<5.2:databases/mysql B-deps: :devel/gmake :devel/libtool :devel/metaauto autoconf-2.61:devel/autoconf/2.61 R-deps: mysql-client->=5.1,<5.2:databases/mysql p5-DBD-mysql-*:databases/p5-DBD-mysql Archs: any
Можно собрать из портов, но в данном примере чтобы не ждать сборки я установлю пакет.
# export PKG_PATH=ftp://ftp.openbsd.org/pub/OpenBSD/4.7/packages/`machine -a`/ # pkg_add mysql-server mysql-server-5.1.42:mysql-client-5.1.42: ok (2 to go) mysql-server-5.1.42:p5-Net-Daemon-0.43: ok (4 to go) mysql-server-5.1.42:p5-PlRPC-0.2018p0: ok (3 to go) mysql-server-5.1.42:p5-DBI-1.609: ok (2 to go) mysql-server-5.1.42:p5-DBD-mysql-4.013: ok (1 to go) mysql-server-5.1.42: ok --- +mysql-server-5.1.42 ------------------- You can find detailed instructions on how to install a database in /usr/local/share/doc/mysql/README.OpenBSD. # pkg_info mysql-client-5.1.42 multithreaded SQL database (client) mysql-server-5.1.42 multithreaded SQL database (server) p5-DBD-mysql-4.013 MySQL drivers for the Perl DBI p5-DBI-1.609 unified perl interface for database access p5-Net-Daemon-0.43 extension for portable daemons p5-PlRPC-0.2018p0 module for writing rpc servers and clients
Вы можете изменить некоторые характеристики демона для повышения устойчивости в работе и\или для ограничению прожорливости MySQL. Обычно изменяют такие переменные (есть и другие):
В OpenBSD настройки по умолчанию является действительно хорошим и сконфигурировано на то, чтобы защитить себя. Суть в том: не изменяйте то, что вам не нужно менять тем более не зная, что вы делаете и почему!
Простой способ проверить, если вы достигнете некоторые из этих ограничений для числа открытых таблиц, которые имеются в качестве примера. Просто проверьте командой mysqlcheck, и если вы достигнете ограничения на макс файлы (в качестве примера) то вы увидите это сразу же.
mysqlcheck -m -A -uYourUsers -pYourPassword
Сначала вы можете увидеть ограничения накладываемые на открытые таблицы. Таким образом, вам необходимо увеличить количество открытых таблиц не только в конфигурации MySQL, но и в системе. Таким образом, необходимо простое изменение в sysctl.conf.
Значение по умолчанию хороши для большинства, но у вас может быть очень много открытых таблиц и вам этого может не хватать. Так что следите за системой. И при необходимости скорректируйте MySQL для своих значений.
Изменим ограничения на открытые таблицы вам нужно увеличить не только в конфигурации MYSQL, но и в системе. Для начала я сделаю простое изменение в системе.
Добавим в /etc/sysctl.conf.
# Increase for MySQL kern.maxfiles=14060
Посмотреть текущее значение.
# sysctl kern.maxfiles kern.maxfiles=7030
Установить необходимое значение.
# sysctl kern.maxfiles kern.maxfiles=14060 # sysctl kern.maxfiles kern.maxfiles= 7030 -> 14060
По умолчанию ваш сервер будет работать под пользователем и классом _mysql.
Они были созданы на время установки таким образом, вы должны использовать этот класс. Однако, если вы просто добавите скрипт запуска в rc.local то вы будете использовать дефолтный класс вашего login.conf, а не класс _mysql. Помните, что MySQL это демон и в этом качестве вы должны указать ему использовать класс _mysql при запуске или перезагрузке демона, или он будет использовать класс по умолчанию. Многие пользователи либо забываю этот факт или не знают об этом с самого начала.
В /etc/login.conf добавим:
# Setting used by MySQL daemon #_mysql:\ # :datasize=infinity:\ # :maxproc=infinity:\ # :openfiles-cur=2048:\ # :openfiles-max=4096:\ # :stacksize-cur=8M:\ # :localcipher=blowfish,8:\ # :tc=default: _mysql:\ :openfiles-cur=1024:\ :openfiles-max=2048:\ :tc=daemon:
При необходимости перестроим файл login.conf.db:
# cap_mkdb /etc/login.conf
Теперь мы должны все это использовать. Если вы просто запустите MySQL с вашего rc.local скрипта, он будет использовать класс по умолчанию, а не тот, который вы добавили. Таким образом, сделаем созданный класс по умолчанию.
Добавим в /etc/rc.local:
# Start MySQL server if [ -x /usr/local/bin/mysqld_safe ] ; then su -c _mysql root -c '/usr/local/bin/mysqld_safe >/dev/null 2>&1 &' echo -n ' mysql' fi
Этот файл, вам необходимо изменить для ваших конкретных потребностей, конечно, и зависит от типов используемых таблиц характеристик оборудования и тп.
# Пример MySQL файла конфигурации для средних систем. # # Это для системы с небольшим объемом памяти (32M - 64M) или для # системы до 128M, где MySQL используется совместно с другими # программами (такими как веб-сервер) # # Вы можете скопировать этот файл в # /etc/my.cnf и установить глобальные параметры, # mysql-data-dir/my.cnf установить сервер-специфические опции # (в данном каталоге установки /var/mysql) или # ~/.my.cnf установить пользовательские опции. # # Для помощи выберете "--help" опцию. # Следующие параметры будут переданы MySQL клиентам [client] #password = your_password port = 3306 socket = /var/run/mysql/mysql.sock # Здесь идут записи для некоторых специфичных программ # Для MySQL сервера [mysqld] port = 3306 socket = /var/run/mysql/mysql.sock #skip-innodb #skip-bdb #skip-locking key_buffer_size = 256M # по умолчанию 16M max_allowed_packet = 1M table_open_cache = 256 # по умолчанию 64 sort_buffer_size = 1M # по умолчанию 512K net_buffer_length = 8K read_buffer_size = 1M # по умолчанию 256K read_rnd_buffer_size = 4M # по умолчанию 512K myisam_sort_buffer_size = 64M # по умолчанию 8M # Не слушайте все TCP / IP-порты. Вы должны повысить безопасность, # если все процессы, которые необходимо подключиться к mysqld работать на одном хосте. # Все взаимодействие с mysqld должны идти через Unix сокеты или именованные каналы. # Обратите внимание, что использование этой опции не включая именованные каналы на Windows # (через опцию "enable-named-pipe" ) будет для mysqld бесполезно! # #skip-networking # Репликации Master Server (по умолчанию) # Бинарный лог, необходимые для репликации log-bin=mysql-bin # Двоичный формат журнала - рекомендован смешанный режим binlog_format=mixed # требуется уникальный идентификатор между 1 и 2^32 - 1 # по умолчанию 1, если мастер-хозяин не установлен # но не будет работать, как мастер, если пропущен server-id = 1 # Репликации Slave (комментарий использования из мастер-секции) # # Чтобы настроить этот хост, как репликация slave, вы можете выбирать между # двумя способами: # # 1) Используйте команду CHANGE MASTER TO (подробно описаны в нашем руководстве) # Синтаксис: # # CHANGE MASTER TO MASTER_HOST = <host>, MASTER_PORT = <port>, # MASTER_USER = <user>, MASTER_PASSWORD = <password>; # #, Где вы замените <host>, <user>, <password> и # <port> номер порта master (по умолчанию 3306). # # Пример: # # CHANGE MASTER TO MASTER_HOST = '125 .564.12.1, MASTER_PORT = 3306, # MASTER_USER = 'Joe', MASTER_PASSWORD "секрет" =; # # Или # # 2) Установить переменные ниже. Однако, в случае, если вы выбираете этот метод, # то в начале репликации в первый раз (например если вы # опечатаетесь в пароле мастер-пароля, slave не cможет # подключится), slave создаст master.info файл, и любые более позднии # изменения значений в этом файле переменных ниже будут игнорироваться, и # переопределения содержания master.info файла идет при выключении # slave серверов и дальше удалите master.info с перезагрузкой серверов slave. # По этой причине, вы можете оставить нетронутыми строки ниже # (закоментированными) и вместо этого использовать CHANGE MASTER TO (см. выше) # # Требуется уникальный идентификатор между 2 и 2^32 - 1 # (отличный от мастера) # по умолчанию 2, если мастер-хост установлен # но не будет работать, как slave, если пропущено #server-id = 2 # # Репликации master для этого slave - требуется #master-host = <hostname> # # Имя пользователя slave будет использовать для аутентификации при # подключении к master серверу - требуется #master-user = <username> # # Пароль slave будет использовать для аутентификации при # подключении к master серверу - требуется #master-password = <password> # # Порт прослушивания master сервера. # опция - по умолчанию 3306 #master-port = <port> # # бинарный лог - не требуется для slave, но рекомендуется #log-bin=mysql-bin # Точка следующих путей к различным разделенным дискам #tmpdir = /tmp/ #log-update = /path-to-dedicated-directory/hostname # Раскомментируйте следующее, если вы используете InnoDB таблицы #innodb_data_home_dir = /var/mysql/ #innodb_data_file_path = ibdata1:10M:autoextend #innodb_log_group_home_dir = /var/mysql/ # Вы можете установить .. _buffer_pool_size до 50 - 80% # оперативной памяти, но будьте осторожны настройки памяти слишком высоки #innodb_buffer_pool_size = 16M #innodb_additional_mem_pool_size = 2M # Установите .. _log_file_size до 25% от размера пула буфера #innodb_log_file_size = 5M #innodb_log_buffer_size = 8M #innodb_flush_log_at_trx_commit = 1 #innodb_lock_wait_timeout = 50 [mysqldump] quick max_allowed_packet = 16M [isamchk] key_buffer = 128M sort_buffer_size = 128M read_buffer = 2M write_buffer = 2M [my sql] no-auto-rehash # Удалить следующий символ комментария, если вы не знакомы с SQL #safe-updates [myisamchk] key_buffer_size = 128M # по умолчанию 20M sort_buffer_size = 128M # по умолчанию 20M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout
Запустим демон
# su -c _mysql root -c '/usr/local/bin/mysqld_safe &' > /dev/null & [1] 22118
# ps aux |grep _mysql _mysql 25593 0.2 1.8 42892 19032 p1 S 3:07PM 0:00.34 /usr/local/libexec/mysqld --basedir=/usr/local --datadi
Если вы устанавливаете MySQL в первый раз, вы должны создать
базы данных по умолчанию в первую очередь. Для того чтобы создать базу данных, запустите:
# /usr/local/bin/mysql_install_db Installing MySQL system tables... OK Filling help tables... OK
Не забудьте изменить пароль рута создаем после запуска MySQL.
# /usr/local/bin/mysqladmin -u root password 'ПАРОЛЬ'
Если вам нужно обновить MySQL при обновлении OpenBSD на новую версию, можете использовать pkg_add -u, и вы свободны. =)
man 1 pkg_add
Я покажу как сохранить и восстановить базу данных.
Сохраняем.
# mysqldump -uUSER_DB -h127.0.0.1 -pUSER_DB_PASS DB > DB.sql
Восстанавливаем
# mysql --host=127.0.0.1 -u USER_DB -p DB < DB.sql
В MYSQL есть возможность кэширования часто встречающихся запросов в оперативной памяти, и при поступлении конкретного запроса в MYSQL она возвратит его непосредственно из кеша. Однако в MYSQL по умолчанию эта функция отключена. И нам необходимо править конфигурационный файл MYSQL my.cnf Мы для примера добавим кэш размером в 64МБ. И на будущее с этим кэшом необходимо экспериментировать, чтобы добиться максимальной эффективности. Слишком маленький кэш приведет к тому, что кэшируемые запросы очень часто будут недействительными, а чересчур большой повлечет за собой относительно длительный поиск в кэше. Память будет неэффективно использоваться которая, могла бы пригодится другим службам.
[mysqld] # Включам кэш запросов равным 64МБ query_cache_size=64M # Для индификации ресурсоемких запросов включаем следующее. # Это приведет к регистрации # всех запросов, для которых требуется больше 5 секунд (порог можете менять) long_query_time = 5 log-slow-queries = /var/log/mysql/slow.log
Создаем лог меделенных запросов.
# touch /var/log/mysql/slow.log # chown mysql:mysql /var/log/mysql/slow.log
Перезапустим mysql-server
# /usr/local/etc/rc.d/mysql-server restart
Проверим настройку
# mysql -u otor --password=***** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 692516 Server version: 5.0.77 FreeBSD port: mysql-server-5.0.77_1 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> show variables like 'query_cache%'; +------------------------------+----------+ | Variable_name | Value | +------------------------------+----------+ | query_cache_limit | 1048576 | | query_cache_min_res_unit | 4096 | | query_cache_size | 67108864 | | query_cache_type | ON | | query_cache_wlock_invalidate | OFF | +------------------------------+----------+ 5 rows in set (0.00 sec)
Как видим мы включили кэш (query_cache_type ON) и установили размер его равным 64МБ (query_cache_size 67108864)
MYSQL использует два варианта типа таблиц MyISAM и InnoDB. По умолчанию MYSQL использует MyISAM. MyISAM использует блокировку на уровне таблиц, а InnoDB на уровне строк. Блокировка очень важна для сохранении целостности базы данных она препятствует одновременному обновлению одних и тех же данных двумя разными процессами БД. Посмотрим, является ли причина плохой производительности блокировка таблиц. Для этого посмотрим кол-во конфликтных блокировок в MySQL это Table_locks_immediate и Table_locks_waited.
mysql> show status like 'Table%'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | Table_locks_immediate | 29958 | | Table_locks_waited | 0 | +-----------------------+-------+ 2 rows in set (0.00 sec)
Table_locks_immediate - количество случаев, когда блокировка таблицы была получена немедленно.
Table_locks_waited - когда получение блокировка таблиц сопровождалось ожиданием. Если это значение велико, то у вас проблемы =)
Если у вас CMS, например Drupal то можно некоторые таблицы преобоазовать в InnoDB, например cache, watchdog, session, acceslog делается это так.
mysql> alter table cache type='InnoDB';
(Для настройки производительности MYSQL можно загрузить сценарий MySQL Performance Tuning Primer Script) который позволяет корректировать переменные сервера MySQL.
Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer