|
Программирование >> Создание клиентов mysql
дать с помощью инструкции REPAIR TABLE. Предположим, таблица dictionary была полностью утеряна. Процесс ее восстановления начнем с копирования £г1пч)айла обратно в каталог базы данных. Создать пустые файлы данных и индексов можно с помощью инструкции TRUNCATE TABLE. Затем необходимо скопировать старый файл данных поверх нового. После этого вводится инструкция REPAIR TABLE. В листинге 25.4 показано, как программа MySQL обнаруживает расхождение в количестве записей и перестраивает индексы. mysql> REPAID BLE dictionary; 2 rows in set ( 23.41 sec) Для безопасного создания резервных копий лучше пользоваться специальной программой, чем делать все вручную. С этой целью в дистрибутив MySQL входит Perl-сценарий В листинге 25.5 показано, как с его помощью создаются ко- пии таблиц привилегий. Команде s позволяет убедиться, что все файлы, в том числе индексные, на месте. # mysqlhotcopy mysql /trap/he Locked 6 tables in 0 seconds. Flushed tables (mysql.columns priv, mysql.db, mysql.func, mysql.host, mysql. tables priv, mysql. user) in 0 seconds. Copying 18 files... Copying indices for 0 files... Unlocked tables. mYsqlhotcopY copied б tables (18 files) in 1 second (1 seconds overall). # Is /tmp/hc/mysql columns priv.MYD db.MYD func.MYD host.MYD tables priv.MYD user.MYD colглlms priv.MYI db.MYI func.MYI host.MYI tables priv.MYI user.MYI coliumns priv. f rm db.frm func.frm host.frm tables priv. f rm user.frm Параметры сценария mysqlhotcopy описывались в главе 14, Утилиты командной строки . Он блокирует одновременно все таблицы базы данных, после чего очищает табличные буферы и копирует файлы. Сценарий можно запускать во время работы сервера, даже если в этот момент пользователи делают запросы к базе данных. Естественно, пока происходит копирование таблиц, пользователям будет запрещено вносить в них изменения. Формат табличных файлов понятен только программе MySQL. Если же создать SQL-образы таблиц, то их можно будет перенести в другие СУБД. Кроме того, в некоторых ситуациях полезно просматривать такие SQL-инструкции. Предположим, к Резервное копирование и восстановление 459 примеру, что потеря данных оставалась незамеченной на протяжении нескольких месяцев. Возможно, пользователи удалили какие-то записи и лишь позднее обнаружили, что это было сделано неправильно. Нужно восстановить только удаленные записи, но не известно, когда точно они были удалены. Если резервные копии хранятся в формате SQL, можно просмотреть архивы и поискать, когда последний раз встречались требуемые записи. Недостатком такого способа резервного копирования является то, что процедура восстановления занимает много времени, поскольку программа MySQL вынуждена выполнять каждую инструкцию из архива. Для создание браза таблицы предназначена утилита dump. Она записывает текст инструкций в пото Wout, поэтому нужно перенаправить результаты ее работы в файл. Параметры этой утилиты были описаны в главе 14, Утилиты командной строки . В листинге 25.6 показан созданный этой утилитой образ таблицы db из базы данные ql. Утилита бтла запущена с опцией -opt, которая включает режим оптимальных установок. # MySQL dump 8.13 # # Host: localhost # # Server version Database: mysql 3.23.39-log Table structure for table db DROP TABLE IF EXISTS db; CREATE TABLE db ( Host char(60) binary NOT NULL default , Db char (64) binary NOT NULL default , User char (16) binary NOT NULL default , Select priv enum(N, Y) NOT NULL default Insert priv enumCN, Y) NOT NULL default Update priv enum(N, Y) NOT NULL default Delete priv enum(N , Y) Greate priv enum( N , Y) Drop priv enum(N, Y) NOT NULL default N, Grant priv enumCN, Y) NOT NULL default N, References priv enum( N, Y ) NOT NULL default NOT NULL default NOT NULL default N N N N N Index priv enum( N , Y ) NOT NULL default Alter priv enumCN, Y) NOT NULL default PRIMARY KEY (Host,Db,User), KEY User (User) TYPE=MyISAMCOiyiMENT=Database privileges ; N N tt # # Dumping data for table db LOCK TABLES db WRITE; INSERT INTO db VALUES (%, test, ,Y,Y,Y,Y,Y,Y,N,Y,Y,Y), test\\ %, ,Y,Y,Y,Y,Y,Y,N,Y,Y,Y),( localhost, freetime, httpd ,Y,Y,Y,Y,N,N,N, N,N,N); UNLOCK TABLES; He забудьте заблокировать все таблицы для чтения, прежде чем запускать утилиту mysqldump. В противном случае целостность результатов не гарантируется. Предположим, имеется приложение, которое хранит информацию о клиентах и их электронных адресах. Создание учетной записи нового клиента включает добавление записи в таблицу Ment и последующую вставку одной или нескольких записей в таблицу email address. Если параллельно с этим создавать резервную копию базы данных, то может оказаться, что в промежутке между созданием образов таблиц client ddress приложение попытается обновить обе эти таблицы. Доступ к первой таблице будет запрещен, а ко второй - нет. В результате в архиве появятся адреса, не соответствующие ни одной записи таблицы клиентов. Чтобы восстановить данные из такого архива, достаточно выполнить SQL-сценарий в интерпретатора ql. Можно просто перенаправить сценарий на вход этой утилиты или же воспользоваться ее командой source. Интерпретатор выполнит все инструкции сценария так, как если бы они быливведены в командной строке. Утилита mysqldump имеет режим создания текстового образа таблицы. В этом режиме для каждой архивируемой таблицы создаются два файла. Один из них имеет расширение ql и содержит соответствующую инструкцию CREATE TABLE. Второй файл имеет расширение xt и содержит записи таблицы, причем для разделения полей применяются символы табуляции. В листинге 25.7 показана команда, создающая текстовый образ таблицы dictionary в каталоге /tmp. [/tmp]# mysqldump -verbose =/tmp test dictionary # Connecting to localhost... # Retrieving table structure for table dictionary. . . # Sending SELECT query... # Disconnecting from localhost. . . Для восстановления данных из такого архива необходимо сначала создать таблицу, а затем выполнить инструкцию LOAD DATA INFILE, которая вставит записи в таблицу. Стандартный формат файла, создаваемого утилитой mysqldump, соответствует тому формату, который по умолчанию распознается инструкцией LOAD DATA INFILE. В листинге 25.8 демонстрируется загрузка данных в таблицу dictionary в среде mysql. mysql> source /tmp/dictionary.sql Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.10 sec)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |