Перенос баз данных Mysql на другой диск | FreeBSD, MYSQL

Кратко ситуация: начал сыпаться диск на рабочей машине с mysql. В результате бьются таблицы, repair не помогает. Надо остановить машину, запустить fsck, но доступ к машине только по шеллу. Размонтировать var система не дает, исправить ошибки на неразмонтироавнной ФС нельзя. В принципе все работает кроме БД, следовательно принято решение оставить var в покое и перенести базы на другой диск (благо он смонтирован для бэкапа). Копирую себе на заметку мануал по переносу баз mysql.

Для начала можно посмотреть где базы:

mysql> show variables like 'datadir';
+---------------+----------------+
| Variable_name | Value          |
+---------------+----------------+
| datadir       | /var/db/mysql/ |
+---------------+----------------+
1 row in set (0.00 sec)

Останавливаем mysql копируем каталог с базами, меняем права доступа.

/usr/local/etc/rc.d/mysql-server stop
cp -R /var/db/mysql /data/mysql
chown -R mysql:mysql /data/mysql

Добавим ключ запуска mysql с указанием где лежат базы.

echo 'mysql_dbdir="/usr/mysql"' >> /etc/rc.conf

Запускаемся. Проверяем.

mysql> show variables like 'datadir';
+---------------+-------------+
| Variable_name | Value       |
+---------------+-------------+
| datadir       | /data/mysql/ |
+---------------+-------------+
1 row in set (0.01 sec)

Чекаем базу.

mysqlcheck -Aor -p

Все должно заработать.

Отладка DNS | FreeBSD

Короткая заметка по использованию dig – трассировка запросов dns, последовательно показывает какой сервер какой ответ получает, от корневых серверов до искомого хоста. очень наглядно.

#dig @dns1.comstar.ru your-host.ru +trace

; <<>> DiG 9.4.2-P2 <<>> @dns1.comstar.ru your-host.ru +trace
; (1 server found)
;; global options:  printcmd
.                       332276  IN      NS      d.root-servers.net.
.                       332276  IN      NS      h.root-servers.net.
.                       332276  IN      NS      k.root-servers.net.
.                       332276  IN      NS      j.root-servers.net.
.                       332276  IN      NS      g.root-servers.net.
.                       332276  IN      NS      e.root-servers.net.
.                       332276  IN      NS      m.root-servers.net.
.                       332276  IN      NS      a.root-servers.net.
.                       332276  IN      NS      c.root-servers.net.
.                       332276  IN      NS      b.root-servers.net.
.                       332276  IN      NS      l.root-servers.net.
.                       332276  IN      NS      i.root-servers.net.
.                       332276  IN      NS      f.root-servers.net.
;; Received 492 bytes from 83.242.140.11#53(83.242.140.11) in 6 ms

ru.                     172800  IN      NS      a.dns.ripn.net.
ru.                     172800  IN      NS      b.dns.ripn.net.
ru.                     172800  IN      NS      d.dns.ripn.net.
ru.                     172800  IN      NS      e.dns.ripn.net.
ru.                     172800  IN      NS      f.dns.ripn.net.
;; Received 343 bytes from 199.7.83.42#53(l.root-servers.net) in 30 ms

your-host.ru.          345600  IN      NS      ns.arlc.ru.
your-host.ru.           345600  IN      NS      dns1.comstar.ru.
;; Received 137 bytes from 193.232.156.17#53(f.dns.ripn.net) in 410 ms

your-host.ru.           38400   IN      A       19.21.14.45
your-host.ru.           38400   IN      NS      ns.arlc.ru.
your-host.ru.           38400   IN      NS      dns1.comstar.ru.
;; Received 153 bytes from 83.242.140.11#53(dns1.comstar.ru) in 5 ms

Опция +trace – трассировка запроса, @ – указание какой сервер опрашивать.

Переносим Bind на FreeBSD | FreeBSD

DNS долго крутился на старой машине на Linux появилась необходимость перетащить на новую. В общем все достаточно просто.
Bind в системе уже есть (если ставили),
скрипт управления – в /etc/rc.d/named
файлы конфига и зон в /etc/namedb/ (это алиас на /var/named/etc/namedb)

В /etc/rc.conf добавляем:

named_enable="YES"

Копируем файлы зон (можно все в папку /var/named/etc/namedb, можно по папкам рассовать (что слейвы, что мастера).

Редактируем named.conf

options {
// Relative to the chroot directory, if any
//Место где храним файлы зон, если разложили по папкам, 
//то в описании зоны путь указываем от этой папки
directory<----->"/etc/namedb";
pid-file<------>"/var/run/named/pid";
dump-file<----->"/var/dump/named_dump.db";
statistics-file>"/var/stats/named.stats";
//Скрываем версию
version><------>"Hi to DNS";
//Принимать зоны с
allow-recursion { 15.20.14.0/24; 83.242.140.0/24;};
//вышестоящий ДНС, если есть, будет спрашивать прежде всего у него из его кэша
forwarders {15.20.14.15;};
};

Далее несколько записей чтобы соотвествовать RFС.
Добавляем описание зон

Пример зоны которая хостится на старом и ещё живом серваке

zone "mxxnet.ru" {
   type slave;
            file "mxxnet.ru.hosts";
            allow-transfer {19.20.18.3; 15.20.14.15; };
            masters {
            15.20.14.15;
            };
            };

Если мы решили перетащить зону на новый сервер то будет так

zone "mxxnet.ru" {
   type master;
            file "mxxnet.ru.hosts";
            allow-transfer {19.20.18.3; 15.20.14.15; };
            };

В самом файле описания зоны на старом серваке добавляем оба сервера в качестве хранителя зоны (NX запись)

mcnet.ru. IN NS newserver.ru.

Теперь если все правильно настроено, с мастера после изменений зоны файл будет передаваться на новый сервер. Формат файла зоны немного изменится, но bind поймет и файлы зоны для линукса.

В процессе конфигурирования обращаем внимание на синтаксис (закрывающие скобки, точки с запятой). Перед запуском чекаем конфиг командой:

named-checkconf /etc/namedb/named.conf

Можем поймать ошибки типа

unknown option 'zone'

или ругань на отсутствие скобок и т.д. Проверяем синтаксис, может при редактировании секции options удалили закрывающую скобку.

Если поймали ошибку о невозможности трансфера зоны

failed while receiving responses: permission denied

Проверяем права. Добавляем право на запись группе bind или меняем владельца файлов.

Быстрый подсчет трафика. Darkstat. | FreeBSD

Понадобилось быстро посмотреть активность на сетевом интерфейсе во FreeBSD с подсчетом по хостам чтобы зарезать наиболее активных. Пробуем Darkstat, использует libpcap требует минимальной настройки.

Ставим

#cd /usr/ports/net-mgmt/darkstat/
#make install clean

Создаем папки для базы и pid

mkdir /var/db/darkstat
chown nobody:nobody /var/db/darkstat/
touch /var/db/darkstat/darkstat.db
chmod 666 /var/run/darkstat/darkstat.db

В rc.conf пишем опции запуска:

##############
#Darkstat#####
##############
darkstat_enable="YES"
darkstat_interface="em1"
darkstat_dir="/"
darkstat_pidname="/var/run/darkstat/darkstat.pid"
darkstat_dropuser="nobody"
darkstat_flags="-b 15.21.14.1 -l 15.21.14.0/255.255.255.0 --import /var/db/darkstat/darkstat.db --export /var/db/darkstat/darkstat.db -f 'not port 22'  --local-only "

Запускаем

/usr/local/etc/rc.d/darkstat start
Starting darkstat.

Смотрим в браузере http://15.21.14.1:667

Клонирование системы Clonehdd, dd, Pax | FreeBSD

=========
=CloneHdd=
=========
Понадобилось склонировать диск – старая скази начала сыпаться.

Ставим clonehdd из портов. Смотрим диски

#cd /dev
#ls
#df -h

Выясняем на каком диске стоит система, какой диск целевой. Формат такой – ad0s1a (ad0 – первый диск, s1 – первый слайс, a – раздел). Нам достаточно знать что ad0 – это в моем случае первый ide диск, источник с которого будем копировать – amrd0 (рейд со сказей).

#clonehdd -src=amrd0 -dst=ad0 -fstab -swap=2048

(-src и -dst – диск с которого клонируем и диск куда клонируем, -swap – размер раздела свопа, -fstab – записать файл fstab (c перечнем разделов старого диска, его потом надо будет поправить).

По поводу fstab можно указать сразу имя нового харда:

-fstab=ad0

Предупредит и склонирует. Подводные камни – не стоит просто копировать и править fstab со старого диска, говорят что clonehdd может поменять порядок разделов.
После клонирования может понадобиться запустить sysinstall (или fstab) и сделать новый диск загрузочным. Перед этим надо сделать:

#sysctl kern.geom.debugflags=16

Если поймали ошибку:

umount: /mnt/clone: not a file system root directory

Удаляем директорию /mnt/clone.

========
=dd=====
========

Более простым вариантом может быть просто побитовое копирование диска с помощью dd (есть во всех дистрибутивах, работает быстро (если увеличить буфер).

#dd if=/dev/amrd0 of=/dev/ad0 conv=noerror,sync bs=32k

if=/dev/amrd0 – исходный диск
of=/dev/ad0 – целевой диск
noerror — продолжать после ошибок чтения
sync — дополнять каждый входной блок до размера ibs путем добавления нулевых байт
bs – размер блока (для чтения, записи). Чтобы ускорить работу команды можно увеличить. Но это для случаев когда у нас исходный диск с которого мы переносим систему не сбойный. Если есть сбойные сектора – то лучше уменьшить (в ущерб скорости), но потерянных данных будет меньше (если попадется сбойный блок – то потеряем данных равным значению bs. Диск 62Гб с bs=32k у меня копировался минут сорок.
Для просмотра статуса работы – заходим во вторую консоль н этой же машине и вводим:

#killall -SIGINFO dd

На первой консоли увидим сколько байт скопировано, скорость и время.

После копирования загружаемся со старого диска или загрузочного, запускаем sysinstall идем в Configure, Label выбираем новый диск, первый раздел ad0s1a в нашем случае, и указываем точку монтирования (например каталог /mnt). Затем W изменений. Команда прочекает диск и подмонтирует. На подмонтированном ad0s1a (это рут нового диска) правим fstab. Все можно пробовать грузиться с нового диска. Естественно если перебрасываем железки по контроллерам (SATA0, 1 и т.д.) – то и пути изменяем (ad6, ad7 и т.д).

==========
=PAX======
==========

Для полноты картины упомянем PAX который есть в стандартной поставке, и говорят очень быстрый. Проблема там только с тем что надо руками поготовить всю структуру разделов до применения pax.
Через sysinstall на новом диске создаем слайс и разделы (надо предварительно записать структуру старого диска и создать аналогичную). Рут / должен быть первым разделом (ad0s1a например), слайс – загружаемым. Создаем на старом диске точки монтирования. Монтируем созданные разделы. И запускаем перенос файлов

#cd / && pax -p eme -X -rw . /mnt/root 
#cd /var && pax -p eme -X -rw . /mnt/var
#cd /usr && pax -p eme -X -rw . /mnt/usr

Поскольку там есть сложности с тем что надо точно создать структуру разделов совпадающую со старым диском, и рут у вас не всегда получится сделать вида ad0s1a (бить диск надо в single mode или с диска загружаемого), я не стал использовать pax и остановился на dd.

Не собирается glib20 | FreeBSD

Не собирается glib20

./.libs/libglib-2.0.so: undefined reference to `__sync_fetch_and_or_4'
./.libs/libglib-2.0.so: undefined reference to `__sync_bool_compare_and_swap_4'
./.libs/libglib-2.0.so: undefined reference to `__sync_fetch_and_sub_4'
./.libs/libglib-2.0.so: undefined reference to `__sync_fetch_and_add_4'
./.libs/libglib-2.0.so: undefined reference to `__sync_fetch_and_and_4'
./.libs/libglib-2.0.so: undefined reference to `__sync_fetch_and_xor_4'
gmake[4]: *** [gtester] Error 1
gmake[4]: Leaving directory `/usr/ports/devel/glib20/work/glib-2.36.3/glib'
gmake[3]: *** [all-recursive] Error 1
gmake[3]: Leaving directory `/usr/ports/devel/glib20/work/glib-2.36.3/glib'
gmake[2]: *** [all] Error 2
gmake[2]: Leaving directory `/usr/ports/devel/glib20/work/glib-2.36.3/glib'
gmake[1]: *** [all-recursive] Error 1
gmake[1]: Leaving directory `/usr/ports/devel/glib20/work/glib-2.36.3'
gmake: *** [all] Error 2
*** Error code 1

Stop in /usr/ports/devel/glib20.
*** Error code 1

Stop in /usr/ports/devel/glib20.

Лечится обновлением gcc (из портов /usr/ports/lang/gcc) и прописыванием в make.conf

USE_GCC=4.6

Быстра проверка/оптимизация базы mysql | FreeBSD, MYSQL

Быструю проверку запускаем командой:

#mysqlcheck -Ao -p

Если хотим добавить восстановление добавим атрибут -r:

#mysqlcheck -Aor -p

Не запускается MC libpcre.so.0 | FreeBSD

При запуске mc получаем ошибку:

#mc 
Shared object "libpcre.so.0" not found, required by "libglib-2.0.so.0"

Смотрим чего не хватает mc:

#ldd /usr/local/bin/mc
/usr/local/bin/mc:
	libslang.so.2 => /usr/local/lib/libslang.so.2 (0x28173000)
	libncurses.so.8 => /lib/libncurses.so.8 (0x28278000)
	libglib-2.0.so.0 => /usr/local/lib/libglib-2.0.so.0 (0x282b8000)
	libintl.so.9 => /usr/local/lib/libintl.so.9 (0x2838b000)
	libiconv.so.3 => /usr/local/lib/libiconv.so.3 (0x28394000)
	libpcre.so.3 => /usr/local/lib/libpcre.so.3 (0x2848c000)
	libthr.so.3 => /lib/libthr.so.3 (0x284ec000)
	libc.so.7 => /lib/libc.so.7 (0x2850d000)
	libm.so.5 => /lib/libm.so.5 (0x28635000)
	libpcre.so.0 => not found (0)

Лечим обновлением pcre и командами:

#cd /usr/local/lib
#ln -s libpcre.so.3 libpcre.so.0

Файлик libpcre.so.3 естественно должен быть в каталоге.

tar: Unrecognized archive format | FreeBSD

После обновления портов не собираются некоторые пакеты.

tar: Unrecognized archive format

Решается так. Вторая строка важна если не собирается libarchive с ошибкой

libarchive/filter_fork_posix.c:61:21: error: spawn.h: No such file or directory

Делаем.

#cd /usr/ports/archivers/libarchive
#make ac_cv_header_spawn_h=no
#make install
#ln -sf /usr/local/bin/bsdtar /usr/bin/tar

После этого все должно нормально работать

Postfix дублирование сообщений на два ящика | FreeBSD, Postfix

Простая фича postfix выручает когда надо продублировать поток сообщений для ящика на нашем сервере и стороннего почтового адреса (например дубль входящих сообщений на рабочий и личный ящик сотрудника).

Называется это BCC (что-то типа скрытых копий). Настраивается в master.cf куда добавляем строки с указанием на карты соответствия адреса получателя и адресата копии.

sender_bcc_maps = hash:/usr/local/etc/postfix/sender_bcc
recipient_bcc_maps = hash:/usr/local/etc/postfix/recipient_bcс

Создаем сами файлы:

touch /usr/local/etc/postfix/sender_bcc
touch /usr/local/etc/postfix/recipient_bcс

В файлы пишем пары адресов – ящик в нашем домене и ящику куда надо выслать копию. Разделитель – Tab.
Сохраняем и пересоздаем базы командами.

postmap /usr/local/etc/postfix/sender_bcc
postmap /usr/local/etc/postfix/recipient_bcс

Перезапускаем postfix или делаем reload.

PS: Все сообщения сервера можно дублировать директивой

always_bcc = backup@domain.com

Поиск строки в файлах | FreeBSD

Случилось так что проломали один из серваков. В файлы .js дописана строка с фреймом, в фрейм отображается зараженный модуль, фрейм скрыт за край окна браузера.

Ищем строку выводящую зловредный код:

find /www/sitedir -name '*.*' -exec grep -l "width:100px;height:100px;position:absolute;left:-100px" {} \;

Получим список файлов, строку в файлах убираем (руками, sed, awk, копируем из резервной копии)

Запрещаем писать в файлы .js:

find /www/sitedir -name '*.js*' -exec chflags uchg {} \;

Если надо снять запрет на запись:

find /www/sitedir -name '*.js*' -exec chflags nouchg {} \;

Далее смотрим что случилось, апгрейдим, латаем, переодим на новый сервак, в общем кто как решает подобные проблемы…

cadaver webdav | FreeBSD

В связи с распространением макоси и железок типа файловых хранилищ популярным становится webdav как способ получения доступа к содержимому этих самых железок.

Для винды нашёл bitkinex, но задача была – забирать файлики напрямую на машину с FreeBSD. Из консольных клиентов нашёл – cadaver но поскольку внятных примеров в мане нет пишу себе на заметку.
Продолжить чтение →

Даунгрейд php5 | FreeBSD, IPB

Проапдейтил php c 4 ветки до пятой (5.4), отвалился ipb. Пришлось откатиться до 5.3

Удаляем все пакеты php5 (с зависимостями)

pkg_deinstall -r -f php5

И ставим php53 и php53-extensions. Все.

 

natd не работает сеть | FreeBSD

Заг – специально для поисковиков, поскльку скорее всего именно так можно описать проблему. Например мы перенастроили на гейте сеть на другой шлюз, переключились на резервный интерфейс.
Перенастраиваем natd прописываем нужный интерфейс в rc.conf

natd_interface="xl1"

И здесь же меняем шлюз по умолчанию.

Далее правим rc.firewall (например нат у нас с дивертом):

${fwcmd} add divert natd all from any to any via ${oif2}

Делаем /etc/netstart и … ничего не работает.

Просто мы забыли перезапустит natd. Идем в /etc/rc.d и делаем:

./natd restart

Нат перезапустися с учетом конфигурации на новом интерфейсе.

Очистка бинарного лога mysql | FreeBSD, MYSQL

По дефолту mysql ведет бинарный лог – все транзкции пишутся в файл, и в далнейшем мы имеем возможность восстановить состояние базы на определенный момент. Есть при этом неприятный момент – бинарный лог бстро занимает свободное прострнство на диске. При этом удалять руками файлы типа mysqld-bin.00000Х не стоит – mysql следит за состоянием бинарного лога.

Итак если лог заниимает слишком много места добавляем в /etc/my.cnf строку в секцию [mysqld]:

expire_logs_days=60

Псл этого перезапускаем сервер. Все логи старше 60 дней сервер потрёт.

Проверяем состояние переменной:

mysql> show variables like "%exp%";
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| expire_logs_days         | 60    |
| ft_query_expansion_limit | 20    |
+--------------------------+-------+

Если логи не потрелиcь (или если не хотим перезапускать сервис) – делаем:

mysql> flush logs;