Рубрика «MySQL»

Создание SQL-дампа

SQL-дамп — это текстовой файл с SQL-запросами, выполнение которых воссоздает базу данных. Основным инструментом для создания SQL-дампов в MySQL является утилита mysqldump. Для того, чтобы создать резервную копию базы данных base надо выполнить команду

C:\mysql\bin> mysqldump -u root base > base.sql

Как видите, утилита mysqldump принимает имя пользователя при помощи параметра -u. Если учетная запись защищена паролем, следует добавить параметр -p. После всех параметров указывается имя базы данных, для которой производится создание дампа. Так как вывод данных осуществляется в стандартный поток (за которым по умолчанию закреплен монитор), его следует перенаправить в файл (в нашем случае это base.sql). Перенаправление данных осуществляется при помощи оператора >. Если вместо оператора > использовать >>, то данные не будут перезаписывать уже существующий файл, а будут добавлены в конец файла.

При помощи параметра –databases (в сокращенной форме -B) можно создать дамп сразу нескольких баз данных, которые перечисляются через пробел:

C:\mysql\bin> mysqldump -u root -B base mysql > base_mysql.sql

Так мы сохраняем дампы баз данных base и mysql в файл base_mysql.sql.

Если необходимо сохранить дамп всех баз данных MySQL-сервера, следует воспользоваться параметром –all-databases или в сокращенной форме -A:

C:\mysql\bin> mysqldump -u root --all-databases > all_databases.sql

Развернуть SQL-дамп на другом сервере можно при помощи утилиты mysql в пакетном режиме.

mysql -u root test < base.sql

Здесь данные из дампа base.sql перенаправляются на стандартный вход утилиты mysql, которая размещает таблицы базы данных base в базе данных test.

Ссылки по теме:

Создание резервной копии БД MySQL

Таблицы типа MyISAM являются платформо-независимыми, и их можно перемещать с одного сервера на другой независимо от версии сервера и операционной системы, под управлением которой он работает.

В каталоге данных для каждой базы данных заводится свой подкаталог, а каждая таблица представлена тремя файлами, имена которых совпадают с именами таблицы, а расширения имеют следующий смысл:

  • frm — определяет структуры таблицы, имена полей, их типы, параметры таблицы и т.п.;
  • MYD — содержит данные таблицы (расширение образовано от сокращения MYData);
  • MYI — содержит индексную информацию (расширение образовано от сокращения MYIndex).

Однако копирование данных непосредственно из каталога данных работающего сервера может привести к повреждению копий таблиц, причем это может случиться даже в том случае, если MySQL-сервер не обращался к копируемым таблицам в текущий момент. Поэтому перед копированием бинарных данных необходимо либо остановить сервер, либо блокировать таблицы на запись. Блокировку таблиц удобно осуществлять при помощи оператора FLUSH TABLES:

FLUSH TABLES WITH READ LOCK;

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

Для того, чтобы снять блокировку на запись, следует выполнить запрос

UNLOCK TABLES;

В дистрибутив MySQL входит скрипт горячего копирования бинарных файлов баз данных mysqlhotcopy. Данный скрипт действует по той схеме, что описана ранее: блокирует таблицы базы данных base и копирует их бинарное представление по указанному пути /to/new/path:

mysqlhotcopy base /to/new/path

Ссылки по теме:

Алфавитная навигация для каталога товаров

Для реализации алфавитной навигации надо извлечь все первые буквы товарных позиций из таблицы products и сгруппировать их при помощи конструкции GROUP BY.

После этого достаточно сформировать ссылки с полученными буквами и передать через GET-параметр выбранную посетителем букву:

<?php
session_start();
$_SESSION['navigation'] = array();

$dblocation = "localhost";   // Имя сервера
$dbuser     = "root";        // Имя пользователя
$dbpswrd    = "";            // Пароль
$dbname     = "catalog";     // Имя базы данных

// Соединение с сервером базы данных
$dblink = mysql_connect( $dblocation, $dbuser, $dbpswrd );
mysql_query( 'SET NAMES cp1251' );
// Выбираем базу данных
mysql_select_db( $dbname, $dblink );

// Формируем запрос на извлечение первых букв товарных позиций
$query = 'SELECT SUBSTRING(title,1,1) AS letter
          FROM products
          GROUP BY letter
          ORDER BY letter'
;
$res = mysql_query($query);
// Если имеется хотя бы одна запись - выводим её
if( mysql_num_rows( $res ) > 0 ) {
  echo '<p>Алфавитный указатель:&nbsp;';
  while( $prd = mysql_fetch_array( $res ) ) {
    $_SESSION['navigenion'][] = $prd['letter'];
    echo '<a href="'.$_SERVER['PHP_SELF'].'?letter='.urlencode($prd['letter']).'">'.$prd['letter'].'</a>&nbsp;';
  }
  echo '</p>';
}
echo '<p><a href="'.$_SERVER['PHP_SELF'].'">Все товары</a></p>';
// Если передан параметр letter и он состоит из одного символа -
// выводим содержимое таблицы
if ( isset($_GET['letter']) and in_array($_GET['letter'], $_SESSION['navigenion']) ) {
  $query = "SELECT * FROM products
            WHERE SUBSTRING(title,1,1) = '"
.$_GET['letter']."'
            ORDER BY price"
;
} else {
  $query = "SELECT * FROM products ORDER BY price";
}
$res = mysql_query($query);
// Если имеется хотя бы одна запись - выводим её
if( mysql_num_rows( $res ) > 0 ) {
  $i = 1;
  echo '<table border="1" cellpadding="3" cellspacing="0">';
  echo '<tr><th>№</th><th>Наименование</th><th>Цена</th></tr>';
  while( $prd = mysql_fetch_array( $res ) ) {
    echo '<tr><td>'.$i.'</td><td>'.$prd['title'].'</td><td>'.$prd['price'].'</td></tr>';
    $i++;   
  }
}
?>