Создать ответ 
Резервное копирование базы данных
Автор Сообщение
ale10ey Не на форуме
Генерал-майор
*

Сообщений: 311
У нас с: Nov 2014
Сообщение: #1
Резервное копирование базы данных
Здравствуйте, хочу предложить скрипт для резервного копирования базы данных mysqli, если phpmyadmin не доступен.

Собственно сам скрипт :

PHP код:
<?php

$host 
"localhost";  // имя сервера   
$user "root";       // имя пользователя
$password "";       // пароль
$db_name "ale10ey";     // имя базы данных
$dump_dir "./dump"// директория, куда будем сохранять резервную копию БД

$link mysqli_connect($host$user$password) or die( "Сервер базы данных не доступен" );
$db mysqli_select_db($db_name) or die( "База данных не доступна" );
$tables "SHOW TABLES";
$res mysqli_query($tables) or die( "Ошибка при выполнении запроса: ".mysqli_error() );
while( 
$table mysqli_fetch_row($res) )
{
    
$fp fopen$dump_dir."/".$table[0].".sql""a" );
    if ( 
$fp )
    {
        
$query "TRUNCATE TABLE `".$table[0]."`;\n";
        
fwrite ($fp$query);
        
$rows 'SELECT * FROM `'.$table[0].'`';
        
$r mysqli_query($rows) or die("Ошибка при выполнении запроса: ".mysqli_error());
        while( 
$row mysqli_fetch_row($r) )
        {
            
$query "";
            foreach ( 
$row as $field )
            {
                if ( 
is_null($field) )
                    
$field "NULL";
                else
                    
$field "'".mysqli_escape_string$field )."'";
                if ( 
$query == "" )
                    
$query $field;
                else
                    
$query $query.', '.$field;
            }
            
$query "INSERT INTO `".$table[0]."` VALUES (".$query.");\n";
            
fwrite ($fp$query);
        }
        
fclose ($fp);
    }
}
 
?>


Подключение у меня к БД mysqli, логин root и пароль оставляем как есть, для примера.
Т.е. в принципе все понятно, но у меня данная база ale10ey не сохраняется, а при запуске файла выдается ошибка, указанная в строчке:
PHP код:
$db mysqli_select_db($db_name) or die( "База данных не доступна" ); 

P.S.: Скрипт предложил, но у меня данный скрипт должным образом не работает... Может у вас получится довести его до ума, иногда может пригодиться.
(Последний раз сообщение было отредактировано 11.11.2016 в 23:53:11, отредактировал пользователь ale10ey.)
11.11.2016 23:49:42
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,279
У нас с: Aug 2011
Сообщение: #2
RE: Резервное копирование базы данных
У Вас какая-то неудачная переделка mysql в mysqli.
Вот "подшаманил" немного, вроде работает, но первоначально папку dump нужно создать самому:
PHP код:
<?php
$host 
"localhost";  // имя сервера
$user "root";       // имя пользователя
$password "";       // пароль
$db_name "ale10ey";     // имя базы данных
$dump_dir "./dump"// директория, куда будем сохранять резервную копию БД

$db mysqli_connect($host$user$password$db_name) or die( "Сервер базы данных не доступен" );
$res mysqli_query($db"SHOW TABLES") or die( "Ошибка при выполнении запроса: ".mysqli_error() );
while( 
$table mysqli_fetch_row($res) )
{
    
$fp fopen$dump_dir."/".$table[0].".sql""a" );
    if ( 
$fp )
    {
        
$query "TRUNCATE TABLE `".$table[0]."`;\n";
        
fwrite ($fp$query);
        
$rows 'SELECT * FROM `'.$table[0].'`';
        
$r mysqli_query($db,$rows) or die("Ошибка при выполнении запроса: ".mysqli_error());
        while( 
$row mysqli_fetch_row($r) )
        {
            
$query "";
            foreach ( 
$row as $field )
            {
                if ( 
is_null($field) )
                    
$field "NULL";
                else
                    
$field "'".mysqli_escape_string($db,$field)."'";
                if ( 
$query == "" )
                    
$query $field;
                else
                    
$query $query.', '.$field;
            }
            
$query "INSERT INTO `".$table[0]."` VALUES (".$query.");\n";
            
fwrite ($fp$query);
        }
        
fclose ($fp);
    }
}
?>
12.11.2016 18:23:46
Найти все сообщения Цитировать это сообщение
ale10ey Не на форуме
Генерал-майор
*

Сообщений: 311
У нас с: Nov 2014
Сообщение: #3
RE: Резервное копирование базы данных
Доброе время суток, все работает Ok. Думаю многим данный скрипт пригодиться.
У меня как обычно есть вопросы Pardon

1. Имеется БД размер около 10кб, если все таблицы из базы по отдельности экспортирую и также по отдельности делаю импорт, то все OK, если делаю экспорт всей базы также все ОК, но импорт не работает, выдается ошибка 1 в списке таблицы:
[Изображение: tid_397_acad.png]
хотя по отдельности эта таблица нормально, как и другие импортируются и работают. С таким еще не сталкивался Scratch, где может быть косяк ?

P.S: все разобрался - элементарно, мой косяк Blush

2. Данный скрипт в папку dump помещает все таблицы, а можно чтобы он всю базу в папку сохранил или был бы выбор, какую таблицу нужно сохранить, очень полезно, когда в базе полно таблиц, а сохранить нужно какую-то одну или 2 важных.

3. И вопрос насчет копирования данных из папки в mysql не заходя в phpmyadmin, сложно будет сделать?

4. И последний вопрос, как правильно поступить со стандартным логином (root) и "пустым" паролем. Задать логин и пароль в плане безопасности, который не должен совпадать с паролем админа. Короче, как тут лучше сделать?

5. Сайта еще нет, делаю что могу сам, что-то с помощью ваших скриптов, что-то с помощью своих, сайт информативный будет, прибыли для меня лично не будет никакой, для людей будет полезная информация, а для меня опыт.
Может знания как-нибудь пригодятся, хотя возраст уже далеко за 30, но когда вижу как вы например помогаете людям, то понимаю не все в нашей стране еще потеряно, может и будет светлое будущее Smile

Заранее благодарен Yes
13.11.2016 01:16:25
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,279
У нас с: Aug 2011
Сообщение: #4
RE: Резервное копирование базы данных
Нашел один популярный скрипт для бэкапа БД, переделал его маленько и вот что получилось:
PHP код:
<?php
$host 
"localhost";    // имя сервера
$user "root";        // имя пользователя
$pass "";        // пароль
$db_name "";        // имя базы данных
$dump_dir "./dump/";    // директория, куда будем сохранять БД
$tables '*';        // указываем таблицы через запятую, либо *

$db mysqli_connect($host$user$pass$db_name) or die("Сервер базы данных не доступен");
$t_gen=microtime(1);

//Получаем имена таблиц
if ($tables == '*') {
    
$tables = array();
    
$res mysqli_query($db'SHOW TABLES');
    while (
$row mysqli_fetch_row($res)) $tables[] = $row[0];
}
else 
$tables is_array($tables) ? $tables explode(',',$tables);

//Перебираем все таблицы и формируем данные
foreach($tables as $table) {
    
$res mysqli_query($db,'SELECT * FROM '.$table);
    
$fields mysqli_num_fields($res);

    
$rows mysqli_fetch_row(mysqli_query($db'SHOW CREATE TABLE '.$table));
    
$str.= $rows[1].";\n\n";

    
$rows mysqli_num_rows($res);
    if (
$rows>0) {
        
$str.= 'INSERT INTO '.$table.' VALUES';
        for (
$i 0$i $rows$i++) {
            
$row mysqli_fetch_row($res);
            
$str2 '(';
            for(
$j 0$j $fields$j++) {
                
$row[$j] = addslashes($row[$j]);
                
$row[$j] = ereg_replace("\n","\\n",$row[$j]);
                if (isset(
$row[$j])) $str2 .= '"'.$row[$j].'"' ;
                else 
$str2 .= '""';
                if (
$j<($fields-1)) $str2 .= ',';
            }
            if (
$i<($rows-1)) $str .= $str2."),\n";
            else 
$str .= $str2.");\n";
        }
    }
    
$str .= "\n\n";
}

//Сохраняем бэкап в файл
$fh fopen($dump_dir.$db_name.date("-H.i.s-d.m.Y").'.sql','w+');
fwrite($fh,$str);
fclose($fh);

$t=microtime(1)-$t_gen;
echo 
'Бэкап создан за '.round($t,5). 'с.';
?>

Можно сохранять всю БД или только указанные таблицы. Все сохраняется в один файл. Данные хранятся компактнее, чем в предыдущем скрипте.

При импорте БД необходимо предварительно самому удалить все таблицы из БД.
Думал добавить строчки удаления таблиц в бэкап, но тогда при отсутствии таблиц с указанными именами в БД (если, например, в новой БД бэкап поднимаете) будут выскакивать ошибки.

3. По-моему достаточно считать файл бэкапа в строку (например, $str) и выполнить $res = mysqli_query($db, $str);
Надо попробовать будет.

4. Логин и пароль обычно выдает хостер и как правило они должны отличаться от пароля админа.

P.S. Испробовал импорт бэкапа...
PHP код:
$str=file_get_contents('file_name.sql');
$str is_array($str) ? $str explode(';',$str);
foreach(
$str as $sql$res mysqli_query($db$sql); 
13.11.2016 19:44:49
Найти все сообщения Цитировать это сообщение
ale10ey Не на форуме
Генерал-майор
*

Сообщений: 311
У нас с: Nov 2014
Сообщение: #5
RE: Резервное копирование базы данных
Доброе время суток, проверил в работе.

1. Если данные в базе копировать полностью, т.е строчка
Цитата:$tables = '*'; // указываем таблицы через запятую, либо *
остается без изменения, то происходит бекап в указанную папку,
Цитата:acad-17.47.30-15.11.2016
но выдается ошибка
[Изображение: tid_397_error.png]

и таких строчек много, информация об ошибке одна.

2. Если через запятую указывать, таблицы, к примеру в моем случае
Цитата:$tables = 'dwg_admin, dwg_contacts';
при таком раскладе создается в папке таблица
Цитата:acad-17.56.51-15.11.2016
и не понятно какие я таблицы сохранил, также при этом выдается ошибка
Цитата:Deprecated: Function ereg_replace() is deprecated in D:\Site\OpenServer\domains\site.ru\www\php\res_mysqli.php on line 36
т.е я рассчитывал, что именно мы какую-то страницу сохраняем, то она под сохранятся также, как она называется в базе данных.

3. В конце нескольких строк с одинаковой ошибкой, выдается строка
Цитата:Бэкап создан за 0.10401с.
т.е тут все нормально, работает.

4. Предыдущий код работал, что все таблицы сохранялись сразу правильным названием, т.е к примеру у меня 8 таблиц в базе, они все в папке dump и создались при запуске файла.

Что-то нужно еще в коде поправить ?
Заранее благодарен Yes
15.11.2016 22:57:57
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,279
У нас с: Aug 2011
Сообщение: #6
RE: Резервное копирование базы данных
У меня на локалке PHP 5.2 стоит, поэтому ошибок не видел.
С PHP версии 5.3 и выше ereg_replace считается устаревшей, отсюда и ошибки.

Чтобы не было ошибок, замените всего одну строчку:
PHP код:
$row[$j] = ereg_replace("\n","\\n",$row[$j]); 

на такую:
PHP код:
$row[$j] = preg_replace("/\n/","\\n",$row[$j]); 

Хотя, такой вариант, наверно побыстрее будет:
PHP код:
$row[$j] = str_replace("\n","\\n",$row[$j]); 

Т.е. Вам надо чтобы каждая таблица была в отдельном файле? А если их будет много? У меня, например, у данного сайта 92 таблицы (в основном из-за форума).
Переделать скрипт конечно не составит труда, но если надо, то уже не сегодня.
15.11.2016 23:25:42
Найти все сообщения Цитировать это сообщение
ale10ey Не на форуме
Генерал-майор
*

Сообщений: 311
У нас с: Nov 2014
Сообщение: #7
RE: Резервное копирование базы данных
Здравствуйте, все работает.

1. Да у меня версия 5.5, поэтому ошибка и выдавалась.
Сейчас все таблицы сохраняются в один файл - acad-15.37.09-16.11.2016

2.
Цитата:Вам надо чтобы каждая таблица была в отдельном файле? А если их будет много? У меня, например, у данного сайта 92 таблицы (в основном из-за форума).
Переделать скрипт конечно не составит труда, но если надо, то уже не сегодня.
Да, именно так, как в 1 скрипте данной темы, просто иногда нужно не всю базу, а только несколько таблиц сохранить.
Если, конечно, таблиц как у вас 92 или 65 к примеру, будет глупо прописывать все эти таблицы, чтобы их сохранить, лучше будет сохранить сразу все в один файл

К примеру если сохраняю таблицу dwg_admin или dwg_polls
Цитата:$tables = 'dwg_admin, dwg_polls';
то сохраняется в папке dump, также один sql файл acad-19.16.54-16.11.2016, а не конкретная таблица которую я указывал через запятую в строчке
Цитата:$tables = 'dwg_admin, dwg_polls';

P.S.: иногда бывает нужно скопировать с БД пару каких-то таблиц, чтобы протестировать их и нет смысла сохранять все базу.
Понятно, если делать бекап - копируем все, а для теста на другом локальном сервере нужно сделать импорт 2 или 3 таблиц, чтобы проверить как все работает.
У меня OpenServer, но иногда проверяю все на Denwer, поэтому и требуется бекап только нескольких таблиц, которые быстро можно прописать в файле
В принципе из phpadmin можно сделать, но это на всякий случай, если phpadmin работать не будет, да и быстрей так будет.

Цитата:Испробовал импорт бекапа
Код:
$str=file_get_contents('file_name.sql');
$str = is_array($str) ? $str : explode(';',$str);
foreach($str as $sql) $res = mysqli_query($db, $sql);
Вопрос, данный код как "прикрутить" к файлу (в моем случае res_mysql), чтобы делать бекап файлов в phpadmin.
Заранее благоларен Yes
(Последний раз сообщение было отредактировано 16.11.2016 в 19:30:36, отредактировал пользователь ale10ey.)
16.11.2016 19:27:01
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,279
У нас с: Aug 2011
Сообщение: #8
RE: Резервное копирование базы данных
Так что мешает через POST передать в скрипт названия нужных для бэкапа таблиц? Ведь скрипт независимо от количества сохраняемых таблиц помещает их в один файл, что при дальнейшем импорте намного удобнее, чем импортировать каждую таблицу по отдельности.

Цитата:Вопрос, данный код как "прикрутить" к файлу (в моем случае res_mysql), чтобы делать бекап файлов в phpadmin.
Не понял о чем речь...


Скрипт, сохраняющий каждую таблицу в отдельный файл:
PHP код:
<?php
$host 
"localhost";        // имя сервера
$user "root";            // имя пользователя
$pass "";            // пароль
$db_name "";            // имя базы данных
$dump_dir "./dump/";        // директория, куда будем сохранять БД
$tables '*';            // указываем таблицы через запятую, либо *

$db mysqli_connect("localhost""root"$pass$db_name) or die("Сервер базы данных не доступен");
$t_gen=microtime(1);

//Получаем имена таблиц
if ($tables == '*') {
    
$tables = array();
    
$res mysqli_query($db'SHOW TABLES');
    while (
$row mysqli_fetch_row($res)) $tables[] = $row[0];
}
else 
$tables is_array($tables) ? $tables explode(',',$tables);

//Перебираем все таблицы и формируем данные
foreach($tables as $table) {
    
$str '';
    
$res mysqli_query($db,'SELECT * FROM '.$table);
    
$fields mysqli_num_fields($res);

    
$rows mysqli_fetch_row(mysqli_query($db'SHOW CREATE TABLE '.$table));
    
$str .= $rows[1].";\n\n";

    
$rows mysqli_num_rows($res);
    if (
$rows>0) {
        
$str .= 'INSERT INTO '.$table.' VALUES';
        for (
$i 0$i $rows$i++) {
            
$row mysqli_fetch_row($res);
            
$str2 '(';
            for(
$j 0$j $fields$j++) {
                
$row[$j] = str_replace("\n","\\n",addslashes($row[$j]));
                
$str2 .= '"'.$row[$j].'"';
                if (
$j<($fields-1)) $str2 .= ',';
            }
            if (
$i<($rows-1)) $str .= $str2."),\n";
            else 
$str .= $str2.");\n";
        }
    }

    
//Сохраняем каждую таблицу  в файл
    
$fh fopen($dump_dir.$table.'.sql','w+');
    
fwrite($fh,$str);
    
fclose($fh);
}

$t=microtime(1)-$t_gen;
echo 
'Бэкап создан за '.round($t,5). 'с.';
?>
16.11.2016 21:20:02
Найти все сообщения Цитировать это сообщение
ale10ey Не на форуме
Генерал-майор
*

Сообщений: 311
У нас с: Nov 2014
Сообщение: #9
RE: Резервное копирование базы данных
Цитата:3. По-моему достаточно считать файл бэкапа в строку (например, $str) и выполнить $res = mysqli_query($db, $str);
Надо попробовать будет.

P.S. Испробовал импорт бэкапа...
PHP код:
$str=file_get_contents('file_name.sql');
$str is_array($str) ? $str explode(';',$str);
foreach(
$str as $sql$res mysqli_query($db$sql); 

Здравствуйте, просьба поясните, как именно вы попробовали сделать backup, что-то у меня не получается Scratch

Здравствуйте, все работает (по сообщению #8), все понятно Ok Yes
(Последний раз сообщение было отредактировано 16.11.2016 в 23:40:03, отредактировал пользователь ale10ey.)
16.11.2016 23:38:29
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,279
У нас с: Aug 2011
Сообщение: #10
RE: Резервное копирование базы данных
PHP код:
$str=file_get_contents('file_name.sql');
$str is_array($str) ? $str explode(';',$str);
foreach(
$str as $sql$res mysqli_query($db$sql); 

Этот код предназначен для импорта (восстановления из бэкапа).
Помещаете этот код в любой php файл, указываете вместо file_name.sql путь и имя сделанного ранее бэкапа и обращаетесь через браузер к созданной php страничке.
Как говорил ранее, в БД перед восстановлением таблицы из бэкапа, ее необходимо предварительно удалить.
17.11.2016 15:19:14
Найти все сообщения Цитировать это сообщение
Создать ответ 


Переход:


Пользователи просматривают эту тему: 1 Гость(ей)



Mail.ru LiveInternet

© Copyright 2011-2016 by UsefulScript.ru