Фев 26 2009

Сжатие вывода mysqldump – mysql, gzip, bzip2 и LZMA (7z)

Перенаправление вывода с mysqldump в gzip, bzip2, lzma
Пример для gzip сжатия

mysqldump < mysqldump options> | gzip > outputfile.sql.gz

С помощью gunzip импортируем сжатий дамп gzip-ом

gunzip < outputfile.sql.gz | mysql < mysql options>

Сжимаем вывод mysqldump-a используя архиватор bzip2

mysqldump < mysqldump options> | bzip2 > outputfile.sql.bz2

Импортируем обратно:

Bunzip2 and import using bzip2
bunzip2 < outputfile.sql.bz2 | mysql < mysql options>

Делаем mysql дамп и напрямую сжимаем его с помощью lzma

mysqldump < mysqldump options> | lzma > outputfile.sql.lzma

Импорт

unlzma < outputfile.sql.lzma | mysql < mysql options>

Фев 10 2009

Проверка и оптимизация всех MySQL бд одной командой

Есть хорошая MySQL утилита, называется mysqlcheck, с помощью этой утилиты можно выполнить сразу несколько полезных операций над всеми MySQL базами данных. Команду нужно запускать от суперпользователя root.

Восстановление & Оптимизация

mysqlcheck -Aor

Только ввостановление

mysqlcheck -Ar

Только оптимизация

mysqlcheck -Ao

Описание аргументов:
-A – Проверить на ошибки все Mysql базы данных
-r – Отремонтировать все Mysql базы данных
-o – Оптимизировать все Mysql базы данных


Фев 7 2009

Перенос всех MySQL баз данных с одного сервера на другой

Есть задача, нужно перенести все MySQL базы данных с одного сервера на другой, обычно это делают используя дамп всех MySQL баз данных, затем закачивают на другой сервер и импортируют дамп в MySQL, вариант хорош если вам некуда спешить, и нестрашно потратите вы на это час, два, или пол дня. Для одиночного переноса о репликации говорить тут не уместно. Я предлагаю более идеальный вариант как можно напрямую перенаправлять вывод дампа с одного сервера на другой.

Достоинства:

  • Очень быстро, потому что дамп не попадает даже на жесткий диск, а сразу передается по сети на другой сервер и там же импортируется в MySQL. (Ок, тут немного соврал, возможно что-то где-то свопится :) )
  • Мы напишем скрипт который будет все делать сам при запуске, так мы можем делать бекап всех MySQL баз.
  • А также вы можете положить скрипт в crontab, и регулярно синхронизировать базы данных, без репликации.

Предупреждения

Будьте осторожны, этот скрипт уничтожит все существующие базы данных на стороне нового сервера.
Материал очень серьезный, если вы новичок, и не понимаете что делаете, лучше не рискуйте, потратте больше времени, сделайте стандартными методами бекап, зато будете уверены что все нормально.
А те кого уже достало руками перекидывать базы данных, тот может автоматизировать этот процесс, используя скрипт что ниже.

Скрипт

#!/bin/bash
# Указываем путь к mysql и mysqldump
CMD_MYSQL="/usr/bin/mysql"
CMD_MYSQLDUMP="/usr/bin/mysqldump"
 
# логин, пароль, имя хоста на локальном сервере
DB_USER_FROM="root"
DB_PASS_FROM="passxxx"
DB_HOST_FROM="source.example.com"
 
# логин, пароль, имя хоста на удаленном сервере (куда будет заливаться копия всех бд)
DB_USER_TO="root"
DB_PASS_TO="passxxx"
DB_HOST_TO="destination.example.com"
 
# Получаем список всех БД
echo "database sync"
DATABASES=`echo "SHOW DATABASES;" | ${CMD_MYSQL} -p${DB_PASS_FROM} -u ${DB_USER_FROM} -h ${DB_HOST_FROM}`
 
# Начинаем обрабатывать каждую базу данных кроме information_schema и Database
for DATABASE in $DATABASES; do
  # skip non-databases
  if [ "${DATABASE}" != "Database" ] && [ "${DATABASE}" != "information_schema" ]; then
    echo "transmitting ${DATABASE}"
 
    # Создаем базу данных на удаленном сервере если такая еще не существует
    echo "CREATE DATABASE IF NOT EXISTS ${DATABASE}" | ${CMD_MYSQL} -p${DB_PASS_TO} -u ${DB_USER_TO} -h ${DB_HOST_TO}
 
   #Дампим базу данных и перенаправляем вывод дампа прямо на удаленный сервер
    ${CMD_MYSQLDUMP} -Q -B --create-options --delayed-insert --complete-insert --quote-names --add-drop-table -p${DB_PASS_FROM} -u${DB_USER_FROM} -h${DB_HOST_FROM} ${DATABASE} | ${CMD_MYSQL} -p${DB_PASS_TO} -u ${DB_USER_TO} -h ${DB_HOST_TO} ${DATABASE}
  fi
done

Сохраните куда нибудь скрипт, например в /root/bin и сделайте его выполняемым

chmod  a+x /root/bin/mysql-sync.bash

Что дальше

1) Правим скрипт, указывая свои данные.
2) Проверяем как настроен iptables, разрешаем ему коннект к удаленному серверу и 3306 порту.
3) На удаленном сервере разрешаем подключение к себе (на уровне MySQL).

GRANT all on *.* to 'root'@'hostname';

Запуск

/root/bin/mysql-sync.bash

Способ также хорош для разработчиков веб приложений, которые работают с локальной БД, и часто занимаются переносом бд с local на удаленный сервер. Одним кликом запускаете синхронизацию баз данных, и наслаждатесь процессом.


Янв 20 2009

Защита MySQL от атак типа SQL Injection c помощью GreenSQL (Debian Etch)

GreenSQL greensql-fw служит для того, что бы фильтровать атаки типа SQL иньекции. Работает как reverse-proxy, т.е обрабатывает все входящие на сервер из внешнего мира SQL запросы, проверет и перенаправлет их в MySQL, и получая ответы отправляет их обратно клиенту. В поставку также входит веб-панель greensql-console(PHP) с помощью которой можно управлять GreenSQL через браузер. Я расскажу как установить и настроить GreenSQL Firewall + grrensql-console на системе Debian Etch.

Установка GreenSQL (greensql-fw)
Для Debian Etch уже есть готовый deb пакет, который можно найти и скачать по адресу http://www.greensql.net/download

cd /tmp
curl "http://greensql.net/download/fw_0.9.6_i386.deb" > greensql-fw.deb
dpkg -i greensql-fw.deb

Дальше вы увидите следующие вопросы,

What is the name of the server used to store GreenSQL configuration db (MySQL server)? <-- localhost
What is the database name for the GreenSQL configuration? <-- greendb
Would you like to set up the database and tables automatically? <-- Yes
What is the username of the MySQL administrator? <-- root
Enter the MySQL administrator password <-- your_root_sql_password (пароль вашего mysql root-a)
Confirm this password <-- your_root_sql_password(пароль вашего mysql root-a)
What is the GreenSQL db username? <-- green
What is the GreenSQL user password? <-- greensqlpassword (пароль для green пользователя)

После установки, greensql-fw запустится на 3305 порту. (По умолчанию MySQL на 3306)
Вы можете проверить работоспособность greensql-fw демона исп. например netstat:

netstat -tap | grep greensql

Результат будет примерно следующий:

xhost:~# netstat -tap | grep greensql
tcp        0      0 localhost:3305        *:*         LISTEN     8637/greensql-fw
xhost:~#

Что бы окончательно убедиться в том что greensql-fw полностью функционирует, подключитесь к MySQL через greensql-fw демона:

mysql -h 127.0.0.1 -P 3305 -u root -p

Что бы заставить работать все ваши веб-проекты через greensql вам нужно указать в конфигурационных файлах хост 127.0.0.1 и порт 3305

[...]
$link = mysql_connect('127.0.0.1:3305', 'mysql_user', 'mysql_password');
[...]

ВАЖНО: пишите IP-адресс хоста, а не его имя.

Установка greensql-console
Напомню что greensql-console это веб-панель для администратора. Помагает конфигурировать и контролировать работу GreenSQL фаервола.
Берем отсюда: http://www.greensql.net/download#Debian_Etch

curl "http://greensql.net/download/greensql-console-0.4.6.tar.gz" > greensql-console-0.4.6.tar.gz
tar -zxvf greensql-console-0.4.6.tar.gz
cd greensql-console
emacs config.php # убедитесь что все поля заполнены правильно.

Каталог greensql-console закиньте куда-нить к себе на сайт. Что бы он был доступен по http адресу.
На каталог templates_c что находится внутри greensql-console обьязательно нужно установить права для чтения и записи.

chmod 777 templates_c

Откройте браузер, и перейдите по ссылке http://www.ваш_домен/greensql-console
GreenSQL
По умолчанию логин: admin, пароль: pwd
После того как ввошли меняем пароль на что-то посложнее :)

Быстродействие
А вы как думали? Потери в производительности есть, но небольшие. И я думаю оно того стоит.
Скорость обработки запросов падает на 2-12% в зависимости от количества одновременных запросов. Пусть решает каждий за себя, что ему важнее, потеря производительности в sql запросах на ~6% или сохранность данных.
Подробнее о быстродействи читайте по ссылке: GreenSQL Performance

Альтернативы есть, можно бороться с SQL Injection другими способами, например установив mod_security для Apache, или если у вас на фронтенде nginx, можно используя его фильтровать входящий HTTP траффик. Из тяжелой артилерии – Snort.

Пока-что на этом все.

Ссылки
GreenSQL http://www.greensql.net/