Git, mysql, бэкапы и очумелые ручки

Что-то давно мы тут не изобретали бессмысленных велосипедов.

Итак, ситуация: есть сервачок, на нём крутятся десяток сайтиков средней отстойности. Их базы данных весят в районе нескольких мегабайт и не слишком быстро наполняются.

Хотя сайтики и так себе, но потерять данные и разбираться с их заказчиками всё равно не хотелось бы. Поэтому нужно делать резервные копии.

Ничего из файловой системы сохранять не надо, базы небольшие, ставить и настраивать навороченные системы бэкапов лениво, а руки чешутся сделать что-нибудь бессмысленное и беспощадное. Ну так возьмём и сделаем это.
Остальной текст под катом

WordPress: похожие посты (хардкор-вариант)

Задача: в wordpress’е после статьи выводить список «похожие статьи».

Если у двух статей совпадает один из тегов или категория, то это похожие статьи. Чем больше тегов совпадает, тем сильнее похожие. Вывести нужно пяток наиболее похожих. Если у двух статей одна «релевантность», то выше выводить более свежую.

По запросу «wordpress similar posts» можно найти множество плагинов данной тематики. У них у всех отличный код, подробная документация и богатый набор настроек. Единственный минус: вместо похожих постов они выводят какую-то рандомную хероту.
Остальной текст под катом

mysqldump: игнорирование данных в определённых таблицах

mysqldump

(картинку увёл с adw0rd.ru)

Итак, хотим мы, значит, сделать дамп какой-то mysql-базы с рабочего проекта.
Чтобы скачать себе и развернуть у себя локальную копию.
Или просто в целях бэкапа.

Ну и, конечно, для этого у нас есть наша любимая утилита mysqldump.

Но вот незадача, есть в базе штук пять таблиц в которые пишутся различные логи.
И написалось их уже за время работы сайта, аж на 10 гигабайт.
10 гигабайт эти нам совершенно ни к чему, ни в бэкапе их хранить незачем, ни тем более на локалку себе выкачивать не хочется.
Но и удалять тоже жалко, вдруг пригодятся.


Ну ладно, просто воспользуемся опцией --ignore-table-data, которая, конечно, где-то в обильном списке опций должна быть.
Опа, а нет, оказывается, ничего подобного.
Только заявка на неё и благодарность за заявку.

Какие же другие варианты у нас есть?

--ignore-table: просто игнорировать таблицы. Не катит, структура нам нужна, в них же всё равно что-то писаться будет.

--where="true limit 100": выбрать только сотню записей. Плохо, другие таблицы нам нужны полными.

Придётся сделать в два захода:

1. Сохранить для таблиц с логами только структуру (--no-data).

2. Сделать дамп всех остальных таблиц.

И в сочетании с моими потугами о области изучения баша, получается следующее (здесь мы ещё заодно архивируем дамп в файл с указанием текущей даты):

#!/bin/sh
 
DB_NAME="dbname"
DB_USER="username"
DB_PASS="qwerty"
 
OUTPUT_FILE="$DB_NAME-$(date +%Y-%m-%d).sql.tar.gz"
 
TMP_SQL_FILE="$DB_NAME.sql"
 
tables_cmd=""
ignore_cmd=""
 
for table in "log_table_1" "log_table_2" "log_table_3"
do
    tables_cmd="$tables_cmd $table"
    ignore_cmd="$ignore_cmd --ignore-table=$DB_NAME.$table"
done
 
echo "Dump to $TMP_SQL_FILE"
 
mysqldump \
    -u$DB_USER \
    -p$DB_PASS \
    --databases $DB_NAME \
    --no-create-db \
    --add-drop-table \
    $ignore_cmd \
    > $TMP_SQL_FILE;
 
echo "Append big tables structures to $TMP_SQL_FILE"
 
mysqldump \
    -u$DB_USER \
    -p$DB_PASS \
    --databases $DB_NAME \
    --no-create-db \
    --add-drop-table \
    --tables $tables_cmd \
    --no-data \
    >> $TMP_SQL_FILE;
 
echo "Archiving to $OUTPUT_FILE"
tar -czf $OUTPUT_FILE $TMP_SQL_FILE
 
echo "Remove $TMP_SQL_FILE"
rm $TMP_SQL_FILE

Мои познания в баше не позволили мне вынести список таблиц в отдельную переменную, но и так работает.

В новое десятилетие с новым goDB

goDB logo

Вот, наконец, и закончились праздники. Трудовые люди возвращаются с опостылевшего отдыха на свои любимые рабочие места. И, конечно же, большинство из них будет использовать на работе goDB.

goDB, это иновационная нано-библиотека для работы с MySQL из PHP.

И, несомненно, все воодушевлены благой вестью о том, что в новом году эта чудо-библиотека будет позволять работать не только с MySQL.

go\DB 2.0 на гугло-коде

  1. Система адаптеров позволяет адаптировать go\DB под любой тип СУБД
  2. Вы можете реализовать свой тип СУБД, написать к нему goDB-адаптер и выслать нам
  3. Требуется PHP 5.3
  4. go\DB 2.x ваще не совместима с goDB 1.x
  5. Переработаны системы плейсхолдеров и форматов представления результата
  6. Результат можно получать и сразу из query() и в виде объекта
  7. Ещё не реализованы по сравнения с 1.x транзакции, мультизапросы и подготовленные выражения
  8. Не все тёмные места до конца протестированы, так что на данный момент go\DB 2 находится в бете
  9. Ну и много всего интересного можно подробно узнать в документации

P.S. goDB 1.x продолжает развиваться параллельно и в ней пофикшен небольшой баг. Скачать goDB 1.3.1

goDB 1.3: Транзакции и все, все, все

goDB 1.3: новый говнокод и ебическая сила природы в одном флаконе. Домохозяйки выбирают goDB.

В новой версии при сохранении совместимости с mysqli добавлены надстройки по следующим пунктам:

Транзакции

  1. Станартная схема: BEGIN + COMMIT(ROLLBACK)
  2. Вложенные транзакции, где транзакции нижних уровней не знают о верхних.
  3. Различные способы отката из вложенных транзакций и его обработки.
  4. Выполнение функций в транзакциях

Мультизапросы

  1. Мультизапросы по goDB-схеме: с шаблонами, данными и форматами разбора.
  2. Получение всех результатов сразу или получение только нужных
  3. Различные способы формирования мультизапроса
  4. Обработка ошибок на основе исключений
  5. Не нужно думать о выборке всех результатов и их очистке
  6. Мультизапросы в транзакциях и без них.

Подготовленные выражения

  1. goDB-схема (шаблон, данные, формат результата) вместо bind_param, bind_result
  2. Полная поддержка форматов представления результатов
  3. Обработка ошибок на основе исключений.
  4. Создание и выполнение подготовленного выражения одним запросов.
  5. Кэширование подготовленных выражений.
  6. Именованные подготовленные выражения.

Кроме того, добавлены следующие возможности:

Объект-ссылка

Объект ссылка разделяет подключение с основным объектом, но может иметь другие настройки (префикс, отладка, декоратор запросов).

По мелочи

Формат разбора bool.

Метод __invoke().
В PHP 5.3 запросы можно выполнять прямо так: $one = $db('SELECT 1', null, 'el');

Методы getPrefix(), getDebug() и т.д.

Реструктуризация юнит-тестов: теперь вместо одного файла папка с тестами.

@todo

Все предложения пишите на форуме или присылайте на мыло.

В ближайшее время возможно следующее:

  1. Макроподстановки
  2. Разбиение godb.php на несколько файлов
  3. Формат разбора: объект для разбора :)
  4. Начало работы над goDB 2.0
  5. Нормальные шрифты и цвета для доки

Взять себе

Взять себе
goDB 1.3.0 (zip, 31K)

goDB 1.2.2

Ничто не заставляет делать какое-то дело, как необходимость делать другие более важные дела.
Поэтому goDB продолжает радовать нас новыми версиями.

В новой версии (1.2.2):

Плейсхолдер ?bool: вставка значения для столбца типа BOOL.

Формат представления результата kassoc и его подвид kassoc:$col.

Формат же vars теперь позволяет выборку по одному столбцу: его значение станет как ключём массива, так и его элементом.

Плюс добавлены исключения goDBExceptionFetchUnknown и goDBExceptionFetchUnexpected.
Также местами переписан код.

Сам класс теперь можно просмотреть прямо на сайте не скачивая архивов.

Ну и конечно, можно всё-таки скачать архив (ZIP, 5K)

goDB 1.2.1: теперь и в юнит-тестах

В версии 1.2.1 исправлен незначительный бажок.

А чтобы снизить вероятность незначительных бажков в будущем, добавлены unit-тесты.

Для юнит-тестов используется PHPUnit.

~/godb$ phpunit --colors goDBTest.php
PHPUnit 3.5.0 by Sebastian Bergmann.

............................................................ 60 / 60


Time: 4 seconds, Memory: 4.25Mb

OK (60 tests, 126 assertions)

~/godb$

goDB 1.2

Наконец, впервые за несколько лет, обновил документацию по goDB. Она по-прежнему убогонькая и пафосная, но теперь полностью описаны все новые возможности.

Ну и, так как просто описывать старьё скучно, выпустил новую версию.

Длинные плейсхолдеры

Для всех плейсхолдеров теперь есть «длинные» синонимы:

$db->query('INSERT INTO `table` SET ?set', array($set));
$db->query('INSERT INTO `table` VALUES ?values', array($values));
...

Полный список в документации.

Именованные плейсхолдеры

$data = array(
	'one'   => 'Раз',
	'two'   => 'Два',
	'three' => 'Три',
);
$pattern = 'SELECT * FROM `table` WHERE `one`=?:one AND `two`=?:two OR `three`=?:three ORDER BY ?:one ASC';

Можно комбинировать тип плейсхолдера и имя: ?set:name.

В одном запросе использовать простые и именованные плейсхолдеры нельзя.

Подробнее в документации.

Ещё по-немногу

Добавлены новые параметры конфигурации charset и link:

$config = array(
	'host' => 'localhost',
	...
	'charset' => 'utf8',
);

Не нужно при подключении вызывать SET NAMES. Особенно удобно для отложенных подключений.

link позволяет сделать ссылку на другую базу. Подробнее в разделе о пространстве имён.

Также несколько изменена иерархия подключений.

Несовместимости

При правильном использовании несовместимостей нет. А так, немного есть.

Скачать последнюю версию (ZIP)

goDB 1.1.3

После года разгильдяйничества, решил снова заняться своей библиотечкой для работы с MySQL.

Изменения в версии 1.1.3 незначительны, но, надеюсь, что вскоре будет что-нибудь поинтереснее.

Остальной текст под катом