Intereting Posts
Клонирование и добавление DOMElement: «Неверная ошибка документа» Найдите ключи массива и верните индекс совпадающего ключа SilverStripe 3.1 – Создание и публикация страницы с FrontEnd Предложения для (полу) обеспечения высоких результатов в игре Flash / PHP Что означает <<< END в PHP? Объекты PHP DOMNode и nodeValue как защитить изображения внутри папки загрузки от просмотра кем-либо ЗА ИСКЛЮЧЕНИЕМ admin Ошибка Require_once PHP выполнять несколько запросов сразу в laravel Php: автозаполнение формы с использованием переменных $ _SESSION с несколькими php-файлами AJAX, PHP и Javascript для заполнения проблем с устройством ввода формы sonataNotificationBundle, электронные письма, которые хранятся в базе данных, но потребитель swiftmailer не запускается, и никакие электронные письма не отправляются что означает верхняя часть страницы в php-файле Загружать контент из MySQL в прокрутку с помощью сообщения AJAX Как захватить IP: PORT с регулярным выражением?

Можете ли вы использовать MySQL-запрос для полного создания копии базы данных

У меня есть LIVE версия базы данных MySQL с 5 таблицами и версией TEST.

Я постоянно использую phpMyAdmin, чтобы сделать копию каждой таблицы в LIVE-версии версией TEST.

Кто-нибудь имеет оператор запроса mysql для создания полной копии базы данных? Строка запроса должна учитывать структуру, данные, значения автоматического прироста и любые другие вещи, связанные с таблицами, которые необходимо скопировать.

Благодарю.

Хорошо, после большого количества исследований, поиска в Интернете и чтения всех комментариев здесь я выпустил следующий сценарий, который я теперь запускаю из адресной строки браузера. Протестировал его, и он делает именно то, что мне нужно для этого. Спасибо за помощь каждого.

<?php function duplicateTables($sourceDB=NULL, $targetDB=NULL) { $link = mysql_connect('{server}', '{username}', '{password}') or die(mysql_error()); // connect to database $result = mysql_query('SHOW TABLES FROM ' . $sourceDB) or die(mysql_error()); while($row = mysql_fetch_row($result)) { mysql_query('DROP TABLE IF EXISTS `' . $targetDB . '`.`' . $row[0] . '`') or die(mysql_error()); mysql_query('CREATE TABLE `' . $targetDB . '`.`' . $row[0] . '` LIKE `' . $sourceDB . '`.`' . $row[0] . '`') or die(mysql_error()); mysql_query('INSERT INTO `' . $targetDB . '`.`' . $row[0] . '` SELECT * FROM `' . $sourceDB . '`.`' . $row[0] . '`') or die(mysql_error()); mysql_query('OPTIMIZE TABLE `' . $targetDB . '`.`' . $row[0] . '`') or die(mysql_error()); } mysql_free_result($result); mysql_close($link); } // end duplicateTables() duplicateTables('liveDB', 'testDB'); ?> 

В зависимости от вашего доступа к серверу. Я предлагаю использовать прямые команды mysql и mysqldump . Это все, что делает phpMyAdmin под капотом.

Справочный материал для Mysqldump.

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

Для этого есть класс PHP , я еще не тестировал его.

Из описания:

 This class can be used to backup a MySQL database. It queries a database and generates a list of SQL statements that can be used later to restore the database **tables structure** and their contents. 

Я думаю, это то, что вам нужно.

Привет, вы можете использовать простой скрипт bash для резервного копирования всей базы данных.

 ######### SNIP BEGIN ########## ## Copy from here ############# #!/bin/bash # to use the script do following: # sh backup.sh DBNAME | sh # where DBNAME is database name from alma016 # ex Backuping mydb data: # sh backup.sh mydb hostname username pass| sh echo "#sh backup.sh mydb hostname username pass| sh" DB=$1 host=$2 user=$3 pass=$4 NOW=$(date +"%m-%d-%Y") FILE="$DB.backup.$NOW.gz" # rest of script #dump command: cmd="mysqldump -h $host -u$user -p$pass $DB | gzip -9 > $FILE" echo $cmd ############ END SNIP ########### 

РЕДАКТИРОВАТЬ

Если вам нравится клонировать резервную базу данных, просто отредактируйте дамп и измените имя базы данных, а затем:

  tar xzf yourdump.tar.gz| mysql -uusername -ppass 

– восклицает Арман.

Хорошо в форме скрипта, вы можете попробовать использовать

CREATE TABLE ... LIKE , повторяя список таблиц, которые вы можете получить из SHOW TABLES .

Единственная проблема заключается в том, что не воссоздают индексы или внешние ключи изначально. Поэтому вам придется перечислить их и создать их. Затем несколько INSERT ... SELECT звонков, чтобы получить данные.

Если ваша схема никогда не изменяется, только данные. Затем создайте сценарий, который реплицирует структуру таблицы, а затем просто выполните операцию INSERT ... SELECT в транзакции.

В противном случае mysqldump как говорят другие, довольно легко получить работу из сценария. У меня есть ежедневное задание cron, которое сбрасывает все базы данных с моих серверов центров обработки данных, подключается через FTPS к моему местоположению и отправляет все свалки. Это можно сделать довольно эффективно. Очевидно, вы должны убедиться, что такие объекты заблокированы, но опять же, не слишком тяжело.


В соответствии с запросом кода

Код проприетарный, но я покажу вам критический раздел, который вам нужен. Это происходит из середины цикла foreach , следовательно, операторы continue и префиксы $c.. prefixed (я использую это для указания текущих переменных цикла (или экземпляра)). Команды echo могут быть любыми, что вы хотите, это скрипт cron , поэтому повторение текущего статуса было подходящим. Строки flush() полезны, когда вы запускаете скрипт из браузера, так как вывод будет отправлен до этой точки, поэтому результаты браузера будут заполняться по мере их запуска, а не все в конце. ftp_fput() очевидно, сводится к моей ситуации загрузки дампа где-то и загрузки напрямую из канала – вы можете использовать другой процесс для вывода вывода в процесс mysql для репликации базы данных. Предоставление соответствующих поправок, если они сделаны.

 $cDumpCmd = $mysqlDumpPath . ' -h' . $dbServer . ' -u' . escapeshellarg($cDBUser) . ' -p' . escapeshellarg($cDBPassword) . ' ' . $cDatabase . (!empty($dumpCommandOptions) ? ' ' . $dumpCommandOptions : ''); $cPipeDesc = array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w')); $cPipes = array(); $cStartTime = microtime(true); $cDumpProc = proc_open($cDumpCmd, $cPipeDesc, $cPipes, '/tmp', array()); if (!is_resource($cDumpProc)) { echo "failed.\n"; continue; } else { echo "success.\n"; } echo "DB: " . $cDatabase . " - Uploading Database..."; flush(); $cUploadResult = ftp_fput($ftpConn, $dbFileName, $cPipes[1], FTP_BINARY); $cStopTime = microtime(true); if ($cUploadResult) { echo "success (" . round($cStopTime - $cStartTime, 3) . " seconds).\n"; $databaseCount++; } else { echo "failed.\n"; continue; } $cErrorOutput = stream_get_contents($cPipes[2]); foreach ($cPipes as $cFHandle) { fclose($cFHandle); } $cDumpStatus = proc_close($cDumpProc); if ($cDumpStatus != 0) { echo "DB: " . $cDatabase . " - Dump process caused an error:\n"; echo $cErrorOutput . "\n"; continue; } flush(); 

Если вы используете linux или mac, вот одна строка для клонирования базы данных.

 mysqldump -uUSER -pPASSWORD -hsample.host --single-transaction --quick test | mysql -uUSER -pPASSWORD -hqa.sample.host --database=test 

«Преимущество» здесь заключается в том, что он блокирует базу данных при ее создании. Это означает, что вы получаете согласованную копию. Это также означает, что ваша производственная база будет привязана к длительности копии, что обычно не очень хорошо.

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

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