我知道我可以手动将所有 MySQL 代码复制到文件中,然后将这些文件放入源代码管理中。但是有什么办法可以自动执行此操作吗?
我想对存储过程执行此操作,还想对表/事件/触发器创建脚本执行此操作。
您可以创建数据更改触发器,这会将更改自动存储到某些源代码管理中。但是,没有自动方法来跟踪结构更改(表、存储过程等)。因此,最好的方法可能是转储数据库并将这些转储存储在源代码管理中。您可以定期执行此操作以使事情自动化。
根据 Michal 的回答,我到目前为止使用的解决方案是:
#!/bin/bash
BACKUP_PATH=/root/database_name
DATABASE=database_name
PASSWORD=Password
rm -f "$BACKUP_PATH/*.sql"
mysqldump -p$PASSWORD --routines --skip-dump-date --no-create-info --no-data --skip-opt $DATABASE > $BACKUP_PATH/$DATABASE.sql
mysqldump -p$PASSWORD --tab=$BACKUP_PATH --skip-dump-date --no-data --skip-opt $DATABASE
hg commit -Am "automatic commit" $BACKUP_PATH
不太明白你想做什么。
看看Liquibase,也许它会满足你的需要......
如果您处于 PHP 环境中,此脚本会将过程和函数存储在单独的 (PHP) 文件中,这些文件可用于生成它们并存储在存储库中。
<?php declare(strict_types=1);
// logon the db user, I'm using a mysqli version here
// PDO will need small adjustments.
require "../inc/config.inc.php";
function show_routine(string $type, string $name) {
global $db;
$query = "SHOW CREATE $type `$name`";
$result = $db->query( $query );
foreach( $result as $row ) {
echo "<h1>$name</h1>";
if( is_null($row["Create $type"]) ) {
echo "<p>Not found</p>";
continue;
}
$proc = $row[$type];
$source = $row["Create $type"];
$source = preg_replace( "/(DEFINER=`\w*`@`\w*`)/", "/* $1 */", $source );
echo "<pre>$source</pre>";
$fh = fopen( "./$type/$name.sql", "w" );
fwrite( $fh, "DROP $type IF EXISTS `$name`;" . PHP_EOL . PHP_EOL );
fwrite( $fh, "DELIMITER $$" . PHP_EOL );
fwrite( $fh, $source );
fwrite( $fh, "$$" . PHP_EOL );
fwrite( $fh, "DELIMITER ;" . PHP_EOL );
fclose( $fh );
}
}
foreach( $db->query("show procedure status where db = '<your db-scheme>'") as $row ) {
$name = $row["Name"];
show_routine("Procedure", $name);
}
foreach( $db->query("show function status where db = '<your-db-scheme>'") as $row ) {
$name = $row["Name"];
show_routine("Function", $name);
}
确保 db 用户具有适当的权限。