среда, 28 декабря 2011 г.

пятница, 16 декабря 2011 г.

Несколько копий MySQL на одном сервере

Стала задача запустить вторую копию MySQL на сервере где уже установлена одна копия из репозитория.
Есть несколько вариантов таких как использовать Mysqld_multi...
Так как мне нужно было использовать другую версию я решил использовать бинарную версию скачаную непосредственно с www.mysql.com

# cd /opt
# wget "http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.60-linux-x86_64-glibc23.tar.gz/from/http://mirrors.dotsrc.org/mysql/" 

# tar zxvf mysql-5.1.60-linux-x86_64-glibc23.tar.gz
# ln -s /opt/mysql-5.1.60-linux-x86_64-glibc23/ /opt/mysql

Если нужно добавляем пользователя и группу mysql

# chown -R mysql.mysql /opt/mysq/

# cd /opt/mysql
# scripts/mysql_install_db --user=mysql
# chown -R root .
# mkdir etc mysql-updates tmp logs
# chown -R mysql  data mysql-updates tmp logs
# cp support-files/my-medium.cnf /opt/mysql/etc/my.cnf

В фале конфигурации my.cnf заменяем стандартные порты и адрес к папке с базами данных
[mysqld]
user         = mysql
socket     = /opt/mysql/tmp/mysqld.sock
port         = 3307
pid_file   = /opt/mysql/tmp/mysqld.pid
basedir    = /opt/mysql
datadir    = /opt/mysql/data
tmpdir     = /opt/mysql/tmp
log-slow-queries = /opt/mysql/logs/mysql_slow.log
# Если используем bin-log  то для него тоже задаем путь
log-bin         = /opt/mysql/mysql-updates/worldticket

[client]
port      = 3307
socket  = /opt/mysql/tmp/mysqld.sock

[mysqld_safe]
socket   = /opt/mysql/tmp/mysqld.sock


Для запуска используем команду
# /opt/mysql/bin/mysqld_safe --defaults-file=/opt/mysql/etc/my.cnf &

Для подключения к серверу
# /opt/mysql/bin/mysql --defaults-file=/opt/mysql/etc/my.cnf

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

Перенос базы данных MySQL на другой сервер при минимальном простое

Для обычного перемещения базы MySQL с одного сервера на другой вполне подойдет обычный mysqldump, но когда это продакшен сервер и база занимает больше 10Gb простой может длиться слишком долго. В таких случаях подойдет репликация Master-Slave.

Для начала на обоих серверах включаем bin-log.  Не буду углубляться но этих настроек должно быть достаточно:
binlog-format = ROW
log-bin         = /var/lib/mysql/mysql-updates/mysql-binlogs
expire_logs_days = 14
max_binlog_size = 1024M

Далее на Master добавляем пользователя с правами для репликации
CREATE USER 'replication'@'10.0.0.18' IDENTIFIED BY '123password';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'10.0.0.18';
FLUSH PRIVILEGES;

Делаем дамп необходимой базы с меткой позиции в bin-log
# mysqldump --add-drop-table --flush-logs --master-data=2 --single-transaction database_name | gzip --fast > database_name.sql.gz

 копируем дамп на Slave-сервер, распаковываем его и заливаем в базу
# gzip -d database_name.sql.gz
# mysql  database_name < database_name.sql

 В настройках MySQL (файл my.cnf) в разделе [mysqld]  добавляем параметр в котором укажем имя базы что мы будем реплицировать
   replicate-do-db = database_name
и перезапускаем MySQL

Из дампа смотри имя bin-log  файла и позицию
# cat database_name.sql | grep MASTER_LOG_POS

Далее на Slave в MySQL выполняем команды для настройки репликации
CHANGE MASTER TO MASTER_HOST='10.0.0.20', MASTER_USER='replication',MASTER_PASSWORD='123password', MASTER_LOG_FILE='mysql-binlogs.000267', MASTER_LOG_POS=125827306;
START SLAVE;

в параметрах передаем все необходимые значения.
После всех выполненных действий репликация должны начаться и базы должны быть идентичны.
Командой SHOW SLAVE STATUS\G  можем посмотреть состояние Slave и последние ошибки связанные с репликацией.

 После того как базы синхронизируются мы переводим Slave в режим Master
STOP SLAVE; CHANGE MASTER TO MASTER_HOST=''; RESET SLAVE;

Из конфига убираем replicate-do-db и перезапускаем MySQL.
Все, мы перенесли всю базу на новый сервер, в приложении необходимо всего навсего сменить настройки подключения у новой базе.



пятница, 2 декабря 2011 г.

Get MySQL database size

 SELECT table_schema "Data Base Name",
 sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MB",
 sum( data_free )/ 1024 / 1024 "Free Space in MB" FROM information_schema.TABLES
GROUP BY table_schema ORDER BY 2 DESC;

пятница, 25 ноября 2011 г.

Maximum possible memory usage for MySQL

SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'innodb_additional_mem_pool_size';
SHOW VARIABLES LIKE 'innodb_log_buffer_size';
SHOW VARIABLES LIKE 'thread_stack';
SET @kilo_bytes = 1024;
SET @mega_bytes = @kilo_bytes * 1024;
SET @giga_bytes = @mega_bytes * 1024;
SET @innodb_buffer_pool_size = 2 * @giga_bytes;
SET @innodb_additional_mem_pool_size = 16 * @mega_bytes;
SET @innodb_log_buffer_size = 8 * @mega_bytes;
SET @thread_stack = 192 * @kilo_bytes;
SELECT
( @@key_buffer_size + @@query_cache_size + @@tmp_table_size
+ @innodb_buffer_pool_size + @innodb_additional_mem_pool_size
+ @innodb_log_buffer_size
+ @@max_connections * (
@@read_buffer_size + @@read_rnd_buffer_size + @@sort_buffer_size
+ @@join_buffer_size + @@binlog_cache_size + @thread_stack
) ) / @giga_bytes AS MAX_MEMORY_GB;

четверг, 24 ноября 2011 г.

Количество таблиц в базах - MySQL

echo "show databases;"|mysql |tail -n +2|while read db; do echo -n "$db ";echo "show tables;"|mysql $db|tail -n +2|wc -l; done ;
или проще
#mysqlshow -v

четверг, 10 ноября 2011 г.

вторник, 1 ноября 2011 г.

Изменение docroot для suexec - Apache2.2 (Ubuntu)

Проблема в том что при использовании suexec не возможно запускать скрипты вне директории docroot, а она задается при компиляции. Зачастую она указывает на /var/www, проверить это можно командой /usr/lib/apache2/suexec -V, но нам к примеру необходимо запускать скрипты из /home.

И так приступим

#cd /usr/src
#apt-get build-dep apache2-suexec-custom
#apt-get source apache2-suexec-custom
#cd apache2-2.2.2/
#vi debian/rules
и меняем параметр --with-suexec-docroot=/var/www на что что нам необходимо

после этого компилим пакет и устанавливаем его
#dpkg-buildpackage
#cd ..

проверяем что бы не был установлен apache2 и устанавливаем его из созданных пакетов
#dpkg -i apache2.2-common_2.2.20-1ubuntu1_amd64.deb apache2.2-bin_2.2.20-1ubuntu1_amd64.deb apache2-utils_2.2.20-1ubuntu1_amd64.deb apache2-suexec-custom_2.2.20-1ubuntu1_amd64.deb  apache2-mpm-worker_2.2.20-1ubuntu1_amd64.deb


возможно еще придется сменить права для suexec
#chown root:root /usr/lib/apache2/suexec
#chmod 4755 /usr/lib/apache2/suexec


готово

четверг, 21 июля 2011 г.

FreeBSD: net.inet.ip.fw.one_pass=0

не останавливаться при прохождении правил queue в ipfw

/etc/sysctl.conf
net.inet.ip.fw.one_pass=0

четверг, 14 июля 2011 г.

Переключение между двумя провайдерами

Скрипт переключения между основным и бекапным каналом.
Тестировал на FreeBSD, думаю на Linux он должен работать тоже нормально.
Суть работы простая, пингает два хоста, и если ни один из них не доступен переключается на запасной канал, как только основной канал опять доступен переключается на него обратно.

#!/bin/sh
#
# change-isp.sh
#

PING_HOST1=8.8.8.8
PING_HOST2=8.8.4.4
MAIN_IP=1.1.1.1
MAIN_GW=1.1.1.2
BACKUP_GW=2.2.2.2

CHANNEL_FILE=/tmp/CUR_CHANNEL
CUR_CHANNEL=`cat $CHANNEL_FILE`
LOG=/var/log/change-isp.log


png1=`ping -S $MAIN_IP -c 10 $PING_HOST1 | grep % | awk '{ print $7 };'`
png2=`ping -S $MAIN_IP -c 10 $PING_HOST2 | grep % | awk '{ print $7 };'`


if [ $png1 = '100.0%' ] && [ $png2 = '100.0%' ];
then
            if [ "$CUR_CHANNEL" = "0" ] ; then
               echo `date +"%D - %T"` ">  Change to backup channel" | tee $LOG
               echo 1 > $CHANNEL_FILE
               route change default $BACKUP_GW
            fi
else
            if [ "$CUR_CHANNEL" = "1" ] ; then
               echo `date +"%D - %T"` ">  Change to main channel" | tee $LOG
               echo 0 > $CHANNEL_FILE
               route change default $MAIN_GW
            fi
fi


вторник, 5 июля 2011 г.

Установка OpenManager Server Administrator (OMSA) на Centos 5.5

Устанавливаем SNMP
#yum install -y net-snmp

Данная команда скачивает и выполняет скрипт bootstrap.cgi, который устанавливает дополнительный репозиторий от DEL, с которого уже можно будет установить OMSA.
#wget -q -O - http://linux.dell.com/repo/hardware/latest/bootstrap.cgi | bash

Устанавливаем все компоненты OMSA, хотя можно установить выборочно.
#yum -y install srvadmin-all

Включаем в автозагрузку сервисы и запускаем их
#/opt/dell/srvadmin/sbin/srvadmin-services.sh enable
#/opt/dell/srvadmin/sbin/srvadmin-services.sh start

пробуем подключиться через веб
https://{omsa-server-ip-address}:1311

Используем логин root и системный пароль

вторник, 21 июня 2011 г.

Анализ rootkit-а

Написал скрипт который может определять наличие измененных файлов, может
удалить rootkit и восстановить старые системные файлы.

ckrootkit.centos.sh
ckrootkit.debian.sh

Для определения rootkit команды запускаются с ключом check
#./ckrootkit.centos.sh check

если rootkit найдет, для удаления выполняем команду с ключом clean
#./ckrootkit.centos.sh clean

После удаления нужно переустановить sshd
для Centos:
#yum remove openssh-server && yum install openssh-server &&
/etc/init.d/sshd restart
!!! При переустановке файл sshd_conf полностью заменяется новым, нужно
заново задать все параметры для ssh в этом файле, например не стандартный
порт или разрешенных пользователей.

для Debian:
apt-get remove openssh-server && apt-get install openssh-server &&
/etc/init.d/ssh restart


Эти скрипты с ключом check я добавил в crontab что бы отслеживать
появление этого rootkit в системе.

четверг, 16 июня 2011 г.

Добавление сертификата как доверенного в keystore для java

Для java-1.6.0-openjdk
JAVA_HOME = /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre

#keystore по умолчанию
KEYSTORE = $JAVA_HOME/lib/security/cacerts
#пароль по умолчанию
DEFAULTPASS = changeit

keytool -importcert -trustcacerts -file file.crt -keystore $KEYSTORE -storepass $DEFAULTPASS

среда, 15 июня 2011 г.

среда, 1 июня 2011 г.

MySQL: Drop all tables from database

#!/bin/bash
MUSER="$1"
MPASS="$2"
MDB="$3"
 
# Detect paths
MYSQL=$(which mysql)
AWK=$(which awk)
GREP=$(which grep)
 
if [ $# -ne 3 ]
then
 echo "Usage: $0 {MySQL-User-Name} {MySQL-User-Password} {MySQL-Database-Name}"
 echo "Drops all tables from a MySQL"
 exit 1
fi
 
TABLES=$($MYSQL -u $MUSER -p$MPASS $MDB -e 'show tables' | $AWK '{ print $1}' | $GREP -v '^Tables' )
 
for t in $TABLES
do
 echo "Deleting $t table from $MDB database..."
 $MYSQL -u $MUSER -p$MPASS $MDB -e "drop table $t"
done

среда, 11 мая 2011 г.

Если поломался RAID в Linux

Проверяем состояние рейда
# mdadm -D /dev/md0

узнаем какой диск вылетел из рейда и добавляем его обратно

# mdadm /dev/md0 -a /dev/sdb2

дальше смотрим как пересобирается рейд
# mdadm -D /dev/md0

Разный Default_Root для VirtualHost в Apache для клиентов из разных сетей

Для клиентов из сетей 172.16.0.0 и 192.168.0.0 открывается содержимое папки internal
для всех остальных external

#.htaccess
RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^(172\.16|192\.168)
RewriteRule ^(.*)$ /internal/$1
RewriteCond %{REMOTE_ADDR} !^(172\.2|192\.168)
RewriteRule ^(.*)$ /external/$1

среда, 27 апреля 2011 г.

PPTP - VPN (mpd5)

mpd.conf: ---------------------------------

startup:
# configure mpd users
#set user foo bar admin
#set user foo1 bar1
# configure the console
#set console self 127.0.0.1 5005
#set console open
# configure the web server
#set web self 172.16.1.1 5006
#set web open
set web ip 127.0.0.1
set web port 5006
set web user vpn vpn
set web open

default:
load pptp_server

pptp_server:
set ippool add pool1 192.168.1.21 192.168.1.30
# Create clonable bundle template named B
create bundle template B
#set iface up-script /usr/local/etc/mpd5/if-up.sh
#set iface down-script /usr/local/etc/mpd5/if-down.sh
set iface enable proxy-arp
set iface idle 1800
set iface enable tcpmssfix
set ipcp yes vjcomp
# Specify IP address pool for dynamic assigment.
set ipcp ranges 192.168.1.20/32 ippool pool1
set ipcp dns 192.168.1.1
# The five lines below enable Microsoft Point-to-Point encryption
# (MPPE) using the ng_mppc(8) netgraph node type.
set bundle enable compression
set bundle enable crypt-reqd
set ccp yes mppc
set mppc yes compress e40 e56 e128 stateless
# Create clonable link template named L
create link template L pptp
# Set bundle template to use
set link action bundle B
# Multilink adds some overhead, but gives full 1500 MTU.
set link enable multilink
set link yes acfcomp protocomp
set link disable pap chap eap
set link enable chap chap-msv1 chap-msv2 chap-md5
# We can use use RADIUS authentication/accounting by including
# another config section with label 'radius'.
# load radius
set link keep-alive 10 60
# We reducing link mtu to avoid GRE packet fragmentation.
set link mtu 1460
set link mru 1460
# Configure PPTP
set pptp self 62.216.3.50
# Allow to accept calls
set pptp disable windowing
set link enable incoming



mpd.secret: ---------------------------------

user "paSSword"

среда, 6 апреля 2011 г.

Установка системы плагинов для Cacti 0.8.7g

Устанавливаем Cacti удобным вам способом.

Я установил Cacti на Debian из репозитория.
# apt-get install cacti

Далее качаем систему плагинов с http://cactiusers.org/downloads/plugins/
# wget http://mirror.cactiusers.org/downloads/plugins/cacti-plugin-0.8.7g-PA-v2.8.tar.gz

разархвируем
# tar zxvf cacti-plugin-0.8.7g-PA-v2.8.tar.gz

содержимое папки files-0.8.7g копируем в /usr/share/cacti/site и заменяем все файлы
Далее вносим изменения в базу данных. В разархивированой папке находим файл pa.sql
# mysql -p cacti < pa.sql

Далее загружаем php библиотеку adodb с сайта http://sourceforge.net/projects/adodb/files/
и разархивируем ее в папку /usr/share/cacti/site/lib/
разархивированую папку adodb5 переименовываем в adodb

По идее этого должно было хватить, но я не видел ни одного графика.
Cacti не могла найти файлы rrd
Пришлось подправить файл include/global.php и подставить верный путь.
Примерно на строке 3671 коментируем строку $config["rra_path"] = $config["base_path"] . '/rra';
и добавляем свою с верным путем $config["rra_path"] = '/var/lib/cacti/rra';

Далее добавляем 2 строки в /usr/share/cacti/site/include/config.php

$url_path = "/cacti/";
$plugins = array();


В url_path задается путь для доступа к cacti через web, например http://host.net/cacti/

Теперь для установки плагина необходимо всего навсего загрузить его с сайта http://cactiusers.org/downloads/ и разархивировать в папку /usr/share/cacti/site/plugins
После зайти через web в раздел Console > Plugin Management и включить нужный плагин.

понедельник, 28 марта 2011 г.

Удаленный доступ к PostgreSQL

Если пользователь не существует его нужно добавить:
CREATE USER usrname WITH PASSWORD 'PaSsWoRd';

редактируем файл /var/lib/pgsql/data/postgresql.conf
Задаем параметр
listen_addresses = '*'

далее добавляем в конец файла /var/lib/pgsql/data/pg_hba.conf

# [название базы] [имя юзера] [сеть откуда можно конектиться]
host dbname usrname 0.0.0.0/0 md5

пятница, 25 марта 2011 г.

read only доступ к PostgreSQL

#psql -U postgres -t -c "create role user_ro password 'PaSs' NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN;"

#psql -U postgres -qAt -c "select 'grant select on ' || tablename || ' to \"user_ro\";' from pg_tables where schemaname = 'public'" mydb | psql mydb


Теперь может точно убедиться все ли нормально сработало.
Выбираем таблицу и пробуем изменить данные в ней, выполняем sql-скрипт:
UPDATE tablename SET username='codegeist333' WHERE id=10000;

Если все номрально то увидим ошибку ERROR: permission denied for relation tablename

понедельник, 21 марта 2011 г.

yafc - configure: error: C++ preprocessor "/lib/cpp" fails sanity check

Пытался установить yafc, при ./configure получил вот такую ошибку
configure: error: C++ preprocessor "/lib/cpp" fails sanity check

Решение для Centos:
#yum install gcc-c++

Для Debian:
#apt-get install g++

среда, 16 марта 2011 г.

Удалить все таблицы из базы данных - PostreSQL

Создаем скрипт droptables.bash

#!/bin/bash
psql -t -d $1 -c "SELECT 'DROP TABLE ' || n.nspname || '.' || \
c.relname || ' CASCADE;' FROM pg_catalog.pg_class AS c LEFT JOIN \
pg_catalog.pg_namespace AS n ON n.oid = c.relnamespace WHERE relkind = \
'r' AND n.nspname NOT IN ('pg_catalog', 'pg_toast') AND \
pg_catalog.pg_table_is_visible(c.oid)" > /tmp/droptables

psql -d $1 -f /tmp/droptables
rm -f /tmp/droptables
запускаем и в параметре указываем название базы, из которой будут удалены все таблицы
#su postgres
#./droptables.bash db_name
 

вторник, 15 марта 2011 г.

Автоматизация sFTP c помощью expect

Появилась задача по расписанию бекапить некоторый файлы на sftp.
Вот скрипт который наваял для этого.

#!/usr/bin/expect

set timeout -1
set HOST "1.1.1.1"
set PORT "22"
set USER "user"
set PASS "PsAsSwOrD"
set FILENAME  [lindex $argv 0]

spawn sftp -o "BatchMode no" -oport=$PORT $USER@$HOST:/folder/

expect "password:" { send "$PASS\r" }

expect "sftp> " { send "put $FILENAME\r" }

interact


Из конмдной строки выполняем:
#./sftp-backup /root/file.tgz