измените несколько mysql баз данных сразу (изменения базы данных SAAS)

Мы выполняем PHP (платформа зенда) приложение, которое создает базу данных на пользователя (по security/backup/and причинам других). Все эти базы данных имеют точно ту же структуру, и это будет всегда иметь место. Когда мы развернем новые возможности, мы должны будем развернуть все базы данных с новыми полями/таблицами.

Я читал об использовании dbdeploy для этого, но я не уверен, что они поддерживают несколько баз данных сразу (не давая на имена один за другим). Базы данных называют user1, user2, user3 и так далее.

Есть ли какие-либо хорошие инструменты, которые сделают этот процесс для нас немного легче и менее болезненным? Мы выполняем phing для автоматизированного развертывания и нашли руководство http://www.davedevelopment.co.uk/2008/04/14/how-to-simple-database-migrations-with-phing-and-dbdeploy/ не настолько полезный, потому что они не поддерживают несколько баз данных как, мы имеем.

Кроме того, окна или Mac mysql клиенты, которые могут сделать это, возможны для нас, таким образом, мы открыты для чего-либо

7
задан Jorre 10 July 2010 в 13:58
поделиться

1 ответ

Вот PHP-скрипт, который я собрал для вас. Он получает список всех баз данных и применяет обновления, если имя базы данных начинается с user.

Я также сделал резервное копирование каждой базы данных перед применением изменений. Часть резервного копирования сейчас специфична для Linux/Unix, но ее можно настроить для работы в других операционных системах.

На данный момент он довольно многословен, поэтому вы можете изменить его по мере необходимости. Вы также можете изменить терминатор строки, в зависимости от того, будете ли вы запускать его из CLI или из браузера. Я бы предложил поместить это в каталог скриптов и запускать из CLI.

Дайте мне знать, если вам понадобится что-то еще или если это не сработает для вас.

<?php
// Configure these as needed
$db_host = 'localhost';
$db_user = 'user';
$db_pass = 'password';

$datetime_pattern       = date('Ymd.His');
$backup_file_path       = "/path/to/db_backups/$datetime_pattern/";
$backup_file_format     = "db_backup.%s.sql";
$backup_syntax_pattern  = "/usr/bin/mysqldump --host=%s --user=%s --password=%s --opt %s > $backup_file_path/db_backup.%s.sql";
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!
// CHANGE THE PERMISSIONS!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!
$backup_file_permission = 0777;

// Choose how to terminate your lines
$line_end = "\n";      // Use for CLI
//$line_end = "<br/>";   // Use for browser

// Match words that begin with 'user', case-insensitive
$pattern = '/^user/i';

// What changes will we be applying?
$db_update_syntax = array("ALTER TABLE foo ADD baz1 VARCHAR(30) AFTER bar1",
                          "ALTER TABLE foo ADD baz2 VARCHAR(30) AFTER bar2",
                          "ALTER TABLE foo ADD baz3 VARCHAR(30) AFTER bar3",
                         );

// END OF CONFIGURATION
/////////////////////////////////////////////////////////////


// Create the database backup directory
if (!mkdir($backup_file_path, $backup_file_permission, true)) {
    die('Failed to create backup directory...');
}

// Connecting to MySQL.
$conn = @mysql_connect($db_host, $db_user, $db_pass)
        or die('Not connected : ' . mysql_errno() . ': ' . mysql_error());

$db_list = mysql_list_dbs($conn);

echo "{$line_end}Starting Database Update.{$line_end}";
while ($row = mysql_fetch_assoc($db_list)) {
    $db_name = $row['Database'];
    if (preg_match($pattern, $db_name)) {
        echo "{$line_end}A match was found: [$db_name]{$line_end}";
        echo "Backing up the database{$line_end}";
        // Backup the database
        $backup_syntax = sprintf($backup_syntax_pattern, $db_host, $db_user, $db_pass, $db_name, $db_name);
        exec($backup_syntax);
        $db_selected = mysql_select_db($db_name, $conn)
                       or die("Can't use [$db_name] : " . mysql_error());

        foreach ($db_update_syntax as $each_update_syntax) {
            echo "Altering using: [$alter_syntax]{$line_end}";
            $update_status = mysql_query($alter_syntax);
            if ($update_status) {
                echo "Success!{$line_end}{$line_end}";
            } else {
                echo "Unable to update [$db_name] : " . mysql_error() . "{$line_end}{$line_end}";
            }
        }
    } else {
        echo "Ignoring: [$db_name]{$line_end}";
    }
}
echo "Finished!{$line_end}";
// Free resources / Close MySQL Connection
mysql_free_result($db_list);
mysql_close($conn);
14
ответ дан 6 December 2019 в 15:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: