gladilov.org.ru gladilov.org.ua

54 заметки с тегом

Linux

Позднее Ctrl + ↑

Скрипт подсчёта размера БД MySQL

Понадобилось мне как-то узнать размер таблиц в MySQL-базе данных. Причём узнать в shell script’е. Поискав в сети, наткнулся на чудесный скриптик.

Показать

Допилив его, стал использовать в MRTG. Привожу полностью, без правок/изменений:

#!/bin/bash
# Calculate the storage space used up by all tables in a given MySQL database
# Ben Dowling - www.coderholic.com
database=$1
username=$2
password=$3

if [ ${#database} -eq 0 ]
then
    echo "Usage: $0 <database> [username [password]]"
    exit
fi

if [ "$password" ]
then
   password="-p$password"
fi

mysql="mysql -u $username $password $database"

$mysql -se "USE $database";

tables=$($mysql -se "SHOW TABLES")

totalData=0
totalIndex=0
totalTables=0

for table in $tables
do
   output=$($mysql -se "SHOW TABLE STATUS LIKE \"$table\"\G")
   data=$(echo "$output" | grep Data_length | awk -F': ' '{print $2}')
   dataMegs=$(echo "scale=2;$data/1048576" | bc)
   index=$(echo "$output" | grep Index_length | awk -F': ' '{print $2}')
   indexMegs=$(echo "scale=2;$index/1048576" | bc)
   total=$(($index+$data))
   totalMegs=$(echo "scale=2;$total/1048576" | bc)
   
   echo "$table Data: ${dataMegs}MB Indexes: ${indexMegs}MB Total: ${totalMegs}MB"
   
   totalData=$(($totalData+$data))
   totalIndex=$(($totalIndex+$index))
   totalTables=$(($totalTables+1))
done

dataMegs=$(echo "scale=2;$totalData/1048576" | bc)
indexMegs=$(echo "scale=2;$totalIndex/1048576" | bc)
total=$(($totalIndex+$totalData))
totalMegs=$(echo "scale=2;$total/1048576" | bc)

echo "*** $totalTables Tables | Data: ${dataMegs}MB Indexes: ${indexMegs}MB Total: ${totalMegs}MB ***"

Размеры выводятся в мегабайтах. Пример вывода:

soul@etcetera:~$ ./db.sh somedatabase root ********
wp_comments Data: 6.60MB Indexes: .15MB Total: 6.75MB
wp_links Data: 0MB Indexes: 0MB Total: 0MB
wp_options Data: 1.57MB Indexes: .01MB Total: 1.58MB
wp_postmeta Data: .01MB Indexes: .01MB Total: .02MB
wp_posts Data: .57MB Indexes: .02MB Total: .60MB
wp_term_relationships Data: 0MB Indexes: .01MB Total: .02MB
wp_term_taxonomy Data: 0MB Indexes: 0MB Total: 0MB
wp_terms Data: 0MB Indexes: 0MB Total: 0MB
wp_tla_data Data: 0MB Indexes: 0MB Total: 0MB
wp_tla_rss_map Data: 0MB Indexes: 0MB Total: 0MB
wp_usermeta Data: 0MB Indexes: 0MB Total: 0MB
wp_users Data: 0MB Indexes: 0MB Total: 0MB
*** 12 Tables | Data: 8.78MB Indexes: .25MB Total: 9.03MB ***

Настройка NUT в режиме master + slave

Приобретя ИБП Powercom BNT-1000AP Schuko, поставил себе задачу обеспечить гарантированное питание и корректное завершение работы на важных системах. Имелся в виду мой компьютер (естессно!) и роутер D-Link DIR-320/A2E с установленным там DebWRT (носит гордое имя hive, о нём я уже писал).

Показать

Так как ИБП я выбирал с буквой P в конце названия модели, то он имеет порт для связи с компьютером. В моём случае это был USB-порт (RS-232 и другую экзотику уже в них и не используют давно). В комплекте с ИБП прилагался кабель USB(A)male — USB(B)female. Но им я дотянулся только до компьютера.

На компе поставил пакет NUT (Network UPS Tools). Он состоит из сервера upsd, клиента upsmon и вспомогательных программ:

  • upsc — программа общения с сервером вручную
  • upsdrvctl — программа запуска драйвера ИБП вручную
  • upscmd — программа посылки команд в ИБП вручную
  • upssched — скрипт обработки событий от ИБП

Серверный процесс upsd поддерживает связь с ИБП и отвечает на запросы клиентов.
Клиентский процесс upsmon отвечает за своевременное обнаружение проблем с питанием и принятие необходимых решений.

Поскольку к одному ИБП может быть подключено несколько устройств, то клиентов тоже может быть много. Среди многих клиентов выделен один, запущенный на машине с подключённым ИБП, он называется master, остальные клиенты называются slave. Клиент master сообщает при необходимости slave-клиентам о том, что им надо отключиться и завершить работу машин, на которых они работают. Это обычно происходит перед выключением ИБП из-за пониженного заряда батареи.

В моём случае конфигурация свелась к ебле с созданием файла /dev/ttyUSB0 настройке линка через USB-кабель и редактированию конфигурационных файлов:

  • /etc/nut/nut.conf — указывает тип работы nut
MODE=standalone
UPSD_OPTIONS="-u root"
UPSMON_OPTIONS="-u root"
  • /etc/nut/ups.conf — конфигурация драйвера и способа подключения к ИБП
user=root
[bnt-1000]
driver=usbhid-ups
port=auto
productid=0004
desc="Powercom BNT-100AP Schuko"
  • /etc/nut/upsd.conf — конфигурация сервера
LISTEN 127.0.0.1 3493
LISTEN [адрес в моей домашней IP-сети] 3493

Можно просто указать

LISTEN 0.0.0.0 3493

для того, чтобы сервер слушал запросы на всех интерфейсах.

  • /etc/nut/upsd.user — описание клиентов и пользователей
[soul]
password=<пароль>
action=SET
instcmds=ALL
upsmon=master
[hive]
password=<пароль>
upsmon=slave
  • /etc/nut/upsmon.conf — конфигурация клиента, строка соединения с сервером
RUN_AS_USER root
MONITOR bnt-1000@localhost 1 soul <пароль> master

Также

chown -R nut. /var/run/nut/

На сервере hive настройка была более тривиальной и свелась к установке пакетов nut и nut-cgi и редактированию файла /etc/nut/upsmon.conf:

MONITOR bnt-1000@soul 1 soul <пароль> slave

После этого процесс upsmon на сервере hive смог общаться с процессом upsd на моей машине soul.

Итоговая схема выглядит так:

Стандартный вывод nut-cgi меня не очень устроил:

поэтому я нарисовал свой сайтик с бэкджеком и шлю визуализацией данных от ИБП:

Ссылки:
http://www.ignix.ru/book/freebsd/daemon/network_ups_tools
https://sites.google.com/site/plan0metr/home/nut
http://www.linux.kiev.ua/materials/How-to-use-UPS-with-nut.html

Решение проблемы «???????????? no permissions» в adb

Для теста решил поставить Android SDK на свою машину (у меня смартфон с ОС Андроид), но после установки и докачивания компонентов команда

./adb devices

вывела следующий текст:

List of devices attached
????????????    no permissions

Показать

Оказалось, что в моей системе не было правильно настроенных правил демона udev для этого устройства. Для решения проблемы необходимо знать USB-ID производителя и устройства (VendorID и ProductID), ну и конечно имя пользователя, под которым регистрируетесь в системе.
Я создал файл-правило udev с именем /etc/udev/rules.d/51-android.rules и с таким содержимым:

SUBSYSTEM=="usb", ATTRS{idVendor}=="VendorID", ATTRS{idProduct}=="ProductID", MODE="0666", OWNER="UserLogin"

Затем перегрузил демон udev:

sudo /etc/init.d/udev reload

После этого вывод команды

./adb devices

должен вывести что-то вроде:

List of devices attached
DeviceID    device

Бывает, что уже при настроенных правилах udev всё равно не работает, тогда помогает выполнение команд:

sudo ./adb kill-server
sudo ./adb start-server
./adb devices

После перезапуска сервера ADB мой смартфон определился нормально.

Права на файлы apache

Вчера намудрил с правами файлов моих сайтов, что только не делал для восстановления, и sticki-бит ставил, и менял владельца/группу, и ставил флаг +x.
Сегодня командой

find . -type f -exec chmod 644 {} \; && find . -type d -exec chmod 755 {} \;

вернул всё взад ;-)

Наверх