Чи варто робити резервну копію та відновлювати базу даних mysql?


15

У процесі створення автоматизованого рішення для резервного копіювання та відновлення всього сервера MySQL , я натрапив на mysqlбазу даних, яка, схоже, містить облікові записи користувачів, дозволи, метадані, подібні речі. Чи слід створити резервну копію цієї бази даних? Чи будуть резервні копії та спроби відновити її руйнувати речі?

У мене був час на виклик Googling для "резервного копіювання бази даних mysql", як ви можете собі уявити.


3
Для повного відновлення потрібно створити резервну копію всього, крім бази даних "information_schema".
John Gardeniers

Відповіді:


16

Тут є щось цікаве, що слід врахувати: Резервне копіювання mysqlбази даних дуже обмежує те, що ви можете відновити таку базу даних лише в тій же версії mysql, з якої було запущено резервну копію. Ось чому:

Ось mysql.user з MySQL 5.0.45

mysql> desc mysql.user;
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Field                 | Type                              | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host                  | char(60)                          | NO   | PRI |         |       |
| User                  | char(16)                          | NO   | PRI |         |       |
| Password              | char(41)                          | NO   |     |         |       |
| Select_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv         | enum('N','Y')                     | NO   |     | N       |       |
| Process_priv          | enum('N','Y')                     | NO   |     | N       |       |
| File_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Grant_priv            | enum('N','Y')                     | NO   |     | N       |       |
| References_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Index_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Alter_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Show_db_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Super_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Create_tmp_table_priv | enum('N','Y')                     | NO   |     | N       |       |
| Lock_tables_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Execute_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Repl_slave_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Repl_client_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Create_view_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Show_view_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Create_routine_priv   | enum('N','Y')                     | NO   |     | N       |       |
| Alter_routine_priv    | enum('N','Y')                     | NO   |     | N       |       |
| Create_user_priv      | enum('N','Y')                     | NO   |     | N       |       |
| ssl_type              | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       |
| ssl_cipher            | blob                              | NO   |     |         |       |
| x509_issuer           | blob                              | NO   |     |         |       |
| x509_subject          | blob                              | NO   |     |         |       |
| max_questions         | int(11) unsigned                  | NO   |     | 0       |       |
| max_updates           | int(11) unsigned                  | NO   |     | 0       |       |
| max_connections       | int(11) unsigned                  | NO   |     | 0       |       |
| max_user_connections  | int(11) unsigned                  | NO   |     | 0       |       |
+-----------------------+-----------------------------------+------+-----+---------+-------+
37 rows in set (0.01 sec)

Ось mysql.user з MySQL 5.1.32

mysql> desc mysql.user;
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Field                 | Type                              | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host                  | char(60)                          | NO   | PRI |         |       |
| User                  | char(16)                          | NO   | PRI |         |       |
| Password              | char(41)                          | NO   |     |         |       |
| Select_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv         | enum('N','Y')                     | NO   |     | N       |       |
| Process_priv          | enum('N','Y')                     | NO   |     | N       |       |
| File_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Grant_priv            | enum('N','Y')                     | NO   |     | N       |       |
| References_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Index_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Alter_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Show_db_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Super_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Create_tmp_table_priv | enum('N','Y')                     | NO   |     | N       |       |
| Lock_tables_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Execute_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Repl_slave_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Repl_client_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Create_view_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Show_view_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Create_routine_priv   | enum('N','Y')                     | NO   |     | N       |       |
| Alter_routine_priv    | enum('N','Y')                     | NO   |     | N       |       |
| Create_user_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Event_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Trigger_priv          | enum('N','Y')                     | NO   |     | N       |       |
| ssl_type              | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       |
| ssl_cipher            | blob                              | NO   |     | NULL    |       |
| x509_issuer           | blob                              | NO   |     | NULL    |       |
| x509_subject          | blob                              | NO   |     | NULL    |       |
| max_questions         | int(11) unsigned                  | NO   |     | 0       |       |
| max_updates           | int(11) unsigned                  | NO   |     | 0       |       |
| max_connections       | int(11) unsigned                  | NO   |     | 0       |       |
| max_user_connections  | int(11) unsigned                  | NO   |     | 0       |       |
+-----------------------+-----------------------------------+------+-----+---------+-------+
39 rows in set (0.00 sec)

Ось mysql.user з MySQL 5.5.12

mysql> desc mysql.user;
+------------------------+-----------------------------------+------+-----+---------+-------+
| Field                  | Type                              | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+---------+-------+
| Host                   | char(60)                          | NO   | PRI |         |       |
| User                   | char(16)                          | NO   | PRI |         |       |
| Password               | char(41)                          | NO   |     |         |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N       |       |
| File_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N       |       |
| References_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Show_db_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Super_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N       |       |
| Lock_tables_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Execute_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Repl_slave_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Repl_client_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Create_view_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Show_view_priv         | enum('N','Y')                     | NO   |     | N       |       |
| Create_routine_priv    | enum('N','Y')                     | NO   |     | N       |       |
| Alter_routine_priv     | enum('N','Y')                     | NO   |     | N       |       |
| Create_user_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Event_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Trigger_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Create_tablespace_priv | enum('N','Y')                     | NO   |     | N       |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       |
| ssl_cipher             | blob                              | NO   |     | NULL    |       |
| x509_issuer            | blob                              | NO   |     | NULL    |       |
| x509_subject           | blob                              | NO   |     | NULL    |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0       |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0       |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0       |       |
| max_user_connections   | int(11) unsigned                  | NO   |     | 0       |       |
| plugin                 | char(64)                          | YES  |     |         |       |
| authentication_string  | text                              | YES  |     | NULL    |       |
+------------------------+-----------------------------------+------+-----+---------+-------+
42 rows in set (0.01 sec)

Якщо ви спробуєте відновити mysql.user до версії MySQL, для якої він не був призначений, це створить випадкові проблеми з дозволом. Спосіб резервного копіювання дозволів користувача mysql у версії-агностики - це скидання користувальницьких грантів у SQL. Таким чином, користувацькі гранти є повністю портативними. Є два способи досягти цього:

ВАРІАНТ №1: Використання MAATKIT

mk-show-grants генерує потрібний SQL незалежно від того, до якого екземпляру mysql ви підключитесь. (Майте на увазі, що MAATKIT переноситься на інструментарій Percona. Цей інструмент, швидше за все, буде називатися pt-show-grant).

ВАРІАНТ №2: Сценарій скидання SQL GRANTS

Я написав власну емуляцію mk-show-grants. Це не залишить анонімних користувачів. Це виглядає приблизно так:

mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql

Використання будь-якого з цих параметрів створить більш стабільну резервну копію грантів користувачів.

НА ОДНОЇ ПРИМІТКИ

Тепер, якщо ви використовуєте цю опцію журналу-виводу

[mysqld]
log-output=TABLE

база даних mysql заповнює повільний журнал (якщо він включений) як таблицю mysql в схемі mysql, а не текстовий файл. Отже, робити фізичні резервні копії будуть включати такі журнали на основі таблиці mysql. Повірте, не варто дискової області, якщо загальний і повільний журнал запитів увімкнено і накопичується в схемі mysql. Просто дотримуйтесь параметрів дампа MySQL Grants.

ОНОВЛЕННЯ 2011-09-19 15:54 EDT

Є один дуже важливий фактор у підтримці резервного копіювання дозволів MySQL за допомогою SQL Grants:

Кожен користувач виходить зі своїм паролем у певному модифікованому форматі MD5. Для mysql 4.0 і назад це шістнадцятковий рядок з 16 символів. Для mysql 4.1+ - це 41 символ (Зірочка, а потім шістнадцятковий рядок розміром 40 символів).

Перед тим, як відновити дамп SQL Grants, перевірте файл дамп-файлу SQL Grants на наявність 16-знакових шістнадцяткових паролів. Якщо ви бачите навіть один, ви повинні додати наступне до /etc/my.cnf (або my.ini для Windows) на сервері mysql, до якого відновите:

[mysqld]
old_password=1

Old_password директива дозволяє 16-полукокса і 41 перетворювалися паролі співіснувати і правильно аутентифікації в тому ж примірнику Запуск MySQL. Будь-які паролі, створені вперед, матимуть 16 символів.

Перезапуск MySQL не потрібно. Просто запустіть це:

SET GLOBAL old_password = 1;

+1 для повної відповіді.
Мірча Вутковичі

1
Я б краще SHOW GRANTSQUOTE()SELECT CONCAT('SHOW GRANTS FOR ',QUOTE(user),'@',QUOTE(host),';') FROM mysql.user WHERE user<>'';
написав

11

Так, ви точно хочете створити резервну копію mysqlбази даних - це невід'ємна частина вашого сервісу. Хоча ви можете реконструювати його вміст з іншої інформації, складність цього робити непомірна, якщо ви намагаєтесь швидко повернутися до служби.


1
+1 Якщо ви не створюєте резервну копію бази даних mysql, шанси зламати систему після відновлення дуже великі. Був там, зробив це, отримав ментальні шрами, щоб довести це.
John Gardeniers

6

Ви можете відновити базу даних mysql між версіями, принаймні досить останніми версіями. Існує інструмент, який називається, mysql_upgradeвключений у нові версії MySQL, який оновить системні таблиці для вас.

http://dev.mysql.com/doc/refman/5.0/uk/mysql-upgrade.html


Це дуже правда. Я бачив випадки, коли деякі використовують це та оновлюють просто чудово. Я бачив інших м'ясників. З моєї точки зору, як MySQL DBA. Я втратив віру в цей метод. Оскільки ваша відповідь відображає надійну віру в її використання, ви повинні бути з першої групи. +1 за таку впевненість у mysql_upgrade.
RolandoMySQLDBA

Коли я імпортував свою версію 5.6 у версію 8.0, він захистив сервер.
PHPst

5

Поки ви відновите аналогічну версію mysql, ви можете відновити базу даних mysql з резервної копії. Якщо ви сумніваєтесь, просто зробіть різницю між схемами бази даних mysql (схемою із резервного копіювання та тією, що використовується на новому сервері mysql).


+1 за те, що ви згадали про відновлення mysql до тієї самої версії, з якої ви створили резервну копію.
RolandoMySQLDBA
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.