Debian.pro/

Про Debian


Debian, Ubuntu, LAMP. Very fast way. Часть 2. Работа с Mysql, mysql-backup.

Данная статья является статьей цикла «Установка LAMP на Debian/Ubuntu — very fast way»

В части 1 мануала по лампе мы поставили в т.ч. и mysql. И phpmyadmin. Казалось бы, что ещё нужно для счастья. А нужно знание того, как придерживаться моей идеологии «fast way» при работе с mysql как администратору сервера.

Конечно же, для работы с mysql существует куча прелестных утилит, которые работают в связке с php. Но, во-первых, php есть не на всех серверах, во-вторых — мы слишком ленивы, чтобы открывать что-то, кроме ssh сессии, не правда ли) ?
Как администратору, нам нужно производить с mysql не так много действий. Начнёмс.

Сначала зайдём в консоль mysql:
inky@Debian:~$ mysql -u root -p
Enter password:

Узнать, что мы в консоли mysql мы можем по изменившемуся приветствию:
mysql>

Приступим. Создадим базу:
mysql> create database `dbname`;

Дадим права пользователю muser на базу dbname. Если такого пользователя не существует — он автоматически создастся:
mysql> grant all on `dbname`.* to 'muser'@'localhost';

Я бы порекомендовал бы не давать одному пользователю права на несколько баз… но ваше право, конечно же.
Теперь нам нужно назначить пароль пользователю muser:
mysql> set password for 'muser'@'localhost' = password('megapasswordhere');

Самой собой, megapasswordhere меняем на свой пароль.

Казалось бы, при чём тут fast way? Сейчас объясню.
Введем такую команду:
mysql> create database `dbname2`; grant all on `dbname2`.* to 'muser2'@'localhost'; set password for 'muser2'@'localhost' = password('megapassword2here');

Только что мы создали базу dbname2, дали на неё все права пользователю muser2 и назначили пароль megapassword2here этому пользователю.
Теперь нажимаем стрелку вверх, исправляем цифры 2 на 3, нажимаем enter…. дальше, думаю, вы поняли =) История сохраняется и после выхода из mysql-client. Кстати, выйти из него можно сочетанием клавиш ctrl+D.
Для невнимательных хочу заметить, что имя базы обрамляется обратным апострофом (тем, что на букве Ё на клавиатуре).

Теперь нам было бы неплохо научиться создавать дампы (бэкапы) баз mysql и восстанавливать их. Сразу оговорюсь, что я не испытываю проблем ни со скоростью соединения, ни с пространством на hdd серверов, поэтому я не буду архивировать или сжимать базы.
Приступим. Для начала создадим бэкап отдельной базы, удобный для её восстановления в любую другую базу (например, для переноса на другой хостинг, где принята другая идеология наименования БД). Эти команды следует вводить уже в консоли самого сервера.
inky@Debian:~$ mysqldump --complete-insert --no-create-db -u muser -p dbname > dbname.sql
либо
inky@Debian:~$ mysqldump --complete-insert --no-create-db -u muser -pmegapasswordhere dbname > dbname.sql
В первом случае пароль будет запрошен в интерактивном режиме, во втором… Ну не безопасно, зато удобно)

На выходе мы получим всем дампам дамп.
Во-первых, на время создания бэкапа база будет заблокирована от любых изменений (наглый пользователь, написавший пост во время бэкапа базы форума не попортит вам дамп). (опция —add-locks)
Во-вторых — запросы записываются полностью, с именем столбцов. Увеличивает размер, но снижает возможность ошибки (—complete-insert)
В-третьих — в дамп не добавляется команда CREATE DATABASE, а значит мы можем восстановить этот дамп в любую другую базу по желанию. (—no-create-db —no-create-info)
Ну и да — сам дамп будет в файлике dbname.sql (имя файла указывается после перенаправления вывода (>). Можно использовать конструкцию вида > /backup/dbname.sql)

Ну и восстановим такой бэкап:
inky@Debian:~$ mysql -u muser2 -pmegapassword2here dbname2 < dbname.sql
или с ручным вводом пароля:
inky@Debian:~$ mysql -u muser2 -p dbname2 < dbname.sql
Обратите внимание, что бэкап мы восстанавливаем уже в dbname2.

Я не вижу смысла создавать дампы сразу нескольких баз данных. В конечном итоге ценность такого дампа близка к нулю. Если есть сильное желание - перевод официального мануала по утилите mysqldump находится тут - www.mysql.ru/docs/man/mysqldump.html

Ну и напоследок вкуснятина:
inky@Debian:~$ mysqldump --add-locks --complete-insert --no-create-db --no-create-info -u muser2 -p dbname2 | mysql --host=remote-host -u muser2 -p dbname2
Этой командой мы сможем перенести базу dbname в базу dbname2 на удалённом хосте remote-host. Не забудьте, что пользователю muser2 в этом случае необходимо разрешить удалённый доступ к базе dbname2:
mysql> grant all on `dbname2`.* to 'muser2'@'%';
и установите пароль для 'muser2'@'%'

Ну и З.Ы.
Это 90% задач, которые я, как админ-недоросток, выполняю с mysql. Благодаря тому, что написано выше - их выполнение занимает 10% времени от всей работы с mysql. Удачи вам.


Комментарии (15):

  1. Антон :

    Спасибо тебе огромное! Все четко, быстро и понятно!

  2. andrey :

    Спасибо!

  3. x64 :

    для mysqldump возможна проблемка, в дамп не записывается признак автоинкрементируемого поля, а стандартный id в большинстве задаётся как:
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY
    чтобы побороть это, нужно использовать дополнительную опцию —create-options
    такая своеобразная фича

  4. vasil :

    установил неделю назад debian 6 Создал сайт на локальном сервере. Снес все сознательно,в том числе и базу данных. Пытаюсь установить вновь .
    mysql> create database `dbname`;
    Can’t create database ‘dbname’;database exsists.
    mysql> grant all on `dbname`.* to ‘root’@’localhost’;
    Ok
    mysql> set password for ‘root’@’locahost’= password(‘tad’);
    Can’t find any matching row inthe user table

    Если задать имя базы ‘dbname1’ — процесс повторяется точно также.
    Опять все снес связанное с сайтом начал с нуля —точно такая-же последовательность.
    Подскажите по возможности.

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

  6. vasil :

    Естественно нельзя. Создается OK/Просто я не стал указывать пункт для краткости/

  7. > mysql> set password for ‘root’@’locahost’= password(‘tad’);
    > Can’t find any matching row inthe user table
    Вы здесь пытаетесь изменить пароль руту.

  8. vasil :

    прочитайте сначала мой пост и тяните кота за хвост

  9. Что вам неясно? Mysql говорит вам о том, что вы пытаетесь изменить пароль для несуществующей связки пользователь@хост. В случае с рутом — будет такое же сообщение об ошибке — защита от дурака.
    Показывайте целиком, что в консоли, а не пишите многоуровневую историю на тему «ну я тут вот это делал, но на самом деле вот тут так, а потом так, а ещё растак» — это ничуть не поможет понять, где вы ошиблись.

  10. Спасибо. Кратко. Понятно. Знакомлюсь с postgresql. Не всё получается. Под настроение напишите так же и про неё, и эффективное использование совместно mysql и postgre. Сайты на друпал 7. Вернулся с 8. Кратко о себе. 65 лет. уч. врач. СПб.

  11. > и эффективное использование совместно mysql и postgre. Сайты на друпал 7.
    Никак, друпал не умеет 2 базы использовать для одного сайта (и смысла в этом нет).
    Либо мускуль, либо постгря.

  12. oslo :

    так же вариант создания
    mkdir -p /opt/backup
    nano /opt/backup/backup.sh

    #!/bin/bash
    dirs=»/home /etc»
    out=»/opt/backup»
    day=$(date +%A-%F)
    hostname=$(hostname -s)
    archive=»$hostname-$day.tgz»

    echo «### Directory backup has been started ###»
    echo «### Creating backup archive ###»
    tar czf $out/$archive $dirs
    echo «### Backup successfully completed ###»
    date +%A-%F-%T
    ls -lh $out

    chmod +x /opt/backup/backup.sh

Написать комментарий