Перенос баз данных 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 – трассировка запроса, @ – указание какой сервер опрашивать.

Перенаправление вывода mysql | MYSQL

Иногда хочется перенаправить вывод mysql в файл (не выборку из таблицы а именно то что пишет в консоли mysql. Сделать можно написав последовательность команд в консоли:

# mysql -u root -p -q yourdatabasename -e "source /backup/base.sql;" > /home/dump.log

-q – ваша база
-e – ваша команда

Переносим 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

Cisco Шейпинг трафика | Cisco

Понадобилось зашейпить трафик по айпи на циске.

Первое – трафик определяется acl-ом (списком доступа то есть)

gate2#conf t
gate2(config)#ip access-l ext 101
gate2(config-ext-nacl)#permit ip host 19.21.14.4 any
gate2(config-ext-nacl)#permit ip any host 19.21.14.4

Далее определяем класс. В него пишем наш acl

gate2(config-ext-nacl)#class-map match-any shaper-14.4
gate2(config-cmap)#match access-group 101

Если ещё нужно шейпить по другому айпи, создаем acl и класс.

gate2(config-ext-nacl)#class-map match-any shaper-14.24
gate2(config-cmap)#match access-group 102

Теперь собираем полиси. Полиси накладывается на интерфейс. И надожить можно только один полиси. В него прописываем наши классы. и прописываем ограничения трафика (1000000 – 1Мбит)

gate2(config-cmap)#policy-map PolicyShaperAll
gate2(config-pmap)#class shaper-14.4
gate2(config-pmap-c)#shape average 10000000
gate2(config-pmap)#class shaper-14.24
gate2(config-pmap-c)#shape average 30000000

Накладываем полиси на интерфейсы

gate2(config-pmap-c)#int fa0/0
gate2(config-if)#service-policy output PolicyShaperAll
gate2(config-pmap-c)#int fa0/1
gate2(config-if)#service-policy output PolicyShaperAll

Сохраняем.

Если надо убрать – то убираем последовательно:

no access-list 101 permit ip 19.21.14.4 any

и т.д

The table is full | IPB, MYSQL

Поймал ошибку Mysql: The table is full

По дефолту при создании таблицы в mysql (до 5-й вроде бы версии) существует ограничение на количество записей, размер таблицы. Таблица MyISAM. Достигли размера больше 4Гб и поймали ошибку: The table is full
Сервак на FreeBSD, по идее ограничений на размер файла в 4Гб для ffs нет.

Смотрим.

mysql> show table status like 'new_posts';

Обращаем внимание на Max_data_length он у нас 4294967295.

Вносим изменения в свойства таблицы:

mysql> alter table new_posts max_rows = 1000000000 avg_row_length = 1038;
Query OK, 4131562 rows affected (1 hour 20 min 36.41 sec)
Records: 4131562  Duplicates: 0  Warnings: 0

Запрос займет некоторое продолжительное время.

Проверяем опять.

mysql> show table status like 'new_posts';

Получаем Max_data_length равным 1099511627775. По идее ошибка должна уйти.

Как вывести деньги из PayPal | Разное

Немного не по теме блога но поскольку интернет коммерция процветает и у многих есть аккаунты paypal часто возникает необходисомть вывести средства с PayPal аккаунта. Вывод возможен на счета банков США. Вопрос только в том как заиметь себе такой счет. Собственно все просто, заводим себе карту Payoneer привязываем к аккаунту PayPal и совершенно свободно выводим деньги.
Сайт Payoneer (после регистрации по партнерке получите $25 на счёт)
Карта – обычный дебетовый мастеркард, можно использовать при оплате в магазинах. Кэш с небольшой комиссией снимать в банкоматах (Ситибанка, Юнистрим и т.д.)

Быстра проверка/оптимизация базы 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 Sasl | Courier-imap, Postfix

Упал почтовый сервер, быстро перетащил все на новый, запустил, но споткнулся об авторизацию SASL.
Первый момент – не показывает AUTH при пробах телнетом. Оказалось все просто, проверяем дает ли postfix авторизоваться без tls (смотрим main.cf):

smtpd_tls_auth_only = yes

Если есть такая строка то подключившись телнетом мы не увидим строки типа:

250 AUTH .....

Теперь предположим что имап и поп3 у нас работает а при отправке сасл не даёт авторизоваться. Самый простой вариант – использовать courier-authdaemond.
Он у нас уже прописан в rc.conf и запущен.

Правим конфиг sasl – /usr/local/lib/sasl2/smtpd.conf пишем в него:

pwcheck_method: authdaemond
log_level: 3
mech_list: PLAIN LOGIN
authdaemond_path:/var/run/authdaemond/socket

И права на директорию /var/run/authdaemond даем группе postfix.
Иначе можем поймать ошибку:

SASL authentication failure: cannot connect to Courier authdaemond: Permission denied

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