MySQL tables rename
| ! | Скрипт входит в набор он-лайн инструментов. |
Этот скрипт переименует все таблицы в указанной базе данных MySQL. Перед переименованием можно сделать тестовый запуск, не меняя ничего в БД.
Доступны три варианта:
- Удаление префикса из таблиц. Оставьте поле NEW prefix пустым
- Добавление префикса к таблицам. Оставьте поле OLD prefix пустым
- Замена существующего префикса на новый. Нужно заполнить оба поля
Подсказка: если указать в конце префикса два подчерка "__", то в phpMyAdmin таблицы будут группироваться.
Сам скрипт:
<?php
/*
This script will rename MySQL tables. The licence is Public Domain.
Pavel Malakhov 2011.04.14, http://sysadminwiki.ru/wiki/MySQL_tables_rename
2011.06.27 Added test option, comments and form on result page
Changed 'replace' and 'remove' functions to see if table name needs to be changed
2020.04.17 Adapted to PHP 7 and mysqli
*/
?>
<html>
<head>
<title>MySQL Table Prefix Changer</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<?php
// Check for POST data
$action = isset($_REQUEST['action'])?$_REQUEST['action']:false;
$mysql_server = isset($_REQUEST['server_addr'])?$_REQUEST['server_addr']:"localhost";
$mysql_db = $_REQUEST['db_name'];
$mysql_user = $_REQUEST['db_user'];
$mysql_pass = $_REQUEST['db_pass'];
$prefix_old = $_REQUEST['prefix_old'];
$prefix_new = $_REQUEST['prefix_new'];
$test_mode = $_REQUEST['test']; // We are in the test mode
//-------------------------------------------------
// First run. Get variables
//-------------------------------------------------
?>
<h1 align='center'>Rename MySQL tables </h1>
<p align='center'>for <b>PHP 7</b> and higher (uses mysqli functions)</p>
<small>
<p>* Leave "OLD prefix" blank to add a new prefix to all the tables in the database.</p>
<p>* Leave "NEW prefix" blank to remove a prefix from all the tables.</p>
<p>* In both prefixes include all symbols like "_" or "-" etc. since that will be a substring to search and replace.</p>
<p>* Be carefull about spaces!</p>
<p>* Test before do!!!</p>
</small>
<form name="form1" method="post" action="mysql_tables_rename.php">
<table width="70%" border="0" cellspacing="2" cellpadding="2">
<tr>
<td width=50% align='right'>Server address:</td>
<td width=50%><input name="server_addr" type="text" id="server_addr" size="33" value="<?php echo $mysql_server ?>"></td>
</tr>
<tr>
<td align='right'>Database name:</td>
<td><input name="db_name" type="text" id="db_name" size="33" value="<?php echo $mysql_db ?>"></td>
</tr>
<tr>
<td align='right'>Database user:</td>
<td><input name="db_user" type="text" id="db_user" size="33" value="<?php echo $mysql_user ?>"></td>
</tr>
<tr>
<td align='right'>User password:</td>
<td><input name="db_pass" type="password" id="db_pass" size="33" value="<?php echo $mysql_pass ?>"></td>
</tr>
<tr>
<td align='right'>OLD prefix:</td>
<td><input name="prefix_old" type="text" id="prefix_old" size="33" value="<?php echo $prefix_old ?>"></td>
</tr>
<tr>
<td align='right'>NEW prefix:</td>
<td><input name="prefix_new" type="text" id="prefix_new" size="33" value="<?php echo $prefix_new ?>"></td>
</tr>
<tr>
<td></td>
<td><INPUT TYPE="checkbox" NAME="test" checked>Test before execute<br></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" name="Submit" value="Rename tables">
<input name="action" type="hidden" id="action" value="data"></td>
</tr>
</table>
</form>
<?php
//-------------------------------------------------
// Second run. Need to do something: Test or Rename tables
//-------------------------------------------------
if ($action) {
echo "<hr>";
if ( $test_mode ){ // We are in the test mode.
echo "<center><strong>TEST MODE</strong> <br />no changes to database will be made</center>";
}else{
echo "<center><strong>PRODUCTION MODE</strong> <br /> all changes are to be applied to the real database</center>";
}
// Check if any prefix specified
if ((!$prefix_old) & (!$prefix_new)){
die('No prefix specified! Please set OLD or/and NEW prefix');
}
// Connect to MySQL
$link = new mysqli($mysql_server, $mysql_user, $mysql_pass, $mysql_db);
if ($link->connect_error) {
die('Connect Error (' . $link->connect_errno . ') ' . $link->connect_error);
}
echo "<p>Successfully connected to: <strong>$mysql_db</strong> at <strong>$mysql_server</strong> </p>";
$link->query("SET NAMES 'utf8' ");
// Pull table names into an array and replace prefixes
$table_array = array_column(mysqli_fetch_all($link->query('SHOW TABLES')),0);
// Pull table names into another array after replacing prefixes
// See what to do: Add, Replace or Remove prefix?
// ADD prefix, if the field with old prefix is empty
if (($prefix_old=='') & ($prefix_new<>'')){
echo "<strong> Action:</strong> ADD prefix <strong>'$prefix_new'strong> to all table names \n";
foreach ($table_array as $key => $value) {
$table_names[$key] = prefix_add($value, $prefix_new);
}
}else // REMOVE prefix, if the field with new prefix is empty
if (($prefix_old<>'') & ($prefix_new=='')){
echo "<strong> Action:</strong> REMOVE prefix <strong>'$prefix_old'</strong> from all table names \n";
foreach ($table_array as $key => $value) {
$table_names[$key] = prefix_remove($value, $prefix_old);
}
}else{ // REPLACE prefix, if both fields are not empty
echo "<strong> Action:</strong> REPLACE prefix <strong>'$prefix_old'</strong> with <strong>'$prefix_new'</strong> in every matched table name \n";
foreach ($table_array as $key => $value) {
$table_names[$key] = prefix_replace($value, $prefix_old, $prefix_new);
}
}
// Write new table names back
echo "
<DIV ALIGN=CENTER>
<TABLE CELLPADDING=0 CELLSPACING=0 RULES=COLS >
<TR>
<TD><P ALIGN=center><strong>OLD</strong> table name</P></TD>
<TD><P ALIGN=center><strong>New</strong> table name</P></TD>
</TR>
";
$counter_tables = 0;
$counter_no_changed = 0;
$counter_changed = 0;
$counter_failed = 0;
foreach ($table_array as $key => $value) {
$old_name = $table_array[$key];
$new_name = $table_names[$key];
$counter_tables++;
if ( $test_mode ){ // We are in the test mode. Just show new table names
if ($old_name == $new_name){// don't need to rename this table
$message = "<tr><td>-=(no change)=-</td><td>$old_name</td></tr>\n";
$counter_no_changed++;
}else{ // do rename tables
$message = "<tr><td>". $old_name ."</td><td>". $new_name ."</td></tr>\n";
$counter_changed++;
}
}else{
if ($old_name == $new_name){// don't need to rename this table
$message = "<tr><td>-=(no change)=-</td><td>$old_name</td></tr>\n";
}else{ // do rename tables
$query = sprintf('RENAME TABLE `%s` TO `%s`', $old_name, $new_name);
$result = $link->query($query, MYSQLI_USE_RESULT);
if ($link->errno) {
die('Rename error (' . $link->errno . ') ' . $link->error . ', query: ' / $query);
/*}
//$result = mysql_query($query, $link);
if (!$result) {
$error = mysql_error();
$message = "<tr><td><strong>Failed to:</strong> $query </td><td>$error</td></tr>\n";
$counter_failed++;
*/
} else {
$message = "<tr><td>". $old_name ."</td><td>". $new_name ."</td></tr>\n";
$counter_changed++;
}
}
}
echo "$message";
}
echo "</TABLE>
</DIV>
<hr/>
<p></p>
<center><strong>DONE!</strong></center>
<p></p>
<p> Table renaming statistics:<br />
-=- tables : <strong>$counter_tables</strong><br />
-=- changed : <strong>$counter_changed</strong><br />
-=- did not change: <strong>$counter_no_changed</strong><br />
-=- failed : <strong>$counter_failed</strong>
</p>
</BODY>
</HTML>";
// PHP 7 does not require to close connection
//$link->close();
}
//-----------------------------------
// Functions section
//-----------------------------------
function prefix_add($s, $p_new) {
$s = $p_new.$s;
return $s;
}
function prefix_remove($s, $p_old) {
$pos = strpos($s, $p_old);
if ($pos !== false) {
$s = substr($s, $pos + mb_strlen($p_old));
$name_changed = true;
}
return $s;
}
function prefix_replace($s, $p_old, $p_new) {
$pos = strpos($s, $p_old);
if ($pos !== false) {
$s = substr($s, $pos + mb_strlen($p_old));
$s = $p_new.$s;
$name_changed = true;
}
return $s;
}
?>
<?php
/*
This script will rename MySQL tables. The licence is Public Domain.
Pavel Malakhov 2011.04.14, http://sysadminwiki.ru/wiki/MySQL_tables_rename
2011.06.27 Added test option, comments and form on result page
Changed 'replace' and 'remove' functions to see if table name needs to be changed
*/
?>
<html>
<head>
<title>MySQL Table Prefix Changer</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<?php
// Check for POST data
$action = isset($_REQUEST['action'])?$_REQUEST['action']:false;
$mysql_server = isset($_REQUEST['server_addr'])?$_REQUEST['server_addr']:"localhost";
$mysql_db = $_REQUEST['db_name'];
$mysql_user = $_REQUEST['db_user'];
$mysql_pass = $_REQUEST['db_pass'];
$prefix_old = $_REQUEST['prefix_old'];
$prefix_new = $_REQUEST['prefix_new'];
$test_mode = $_REQUEST['test']; // We are in the test mode
//-------------------------------------------------
// First run. Get variables
//-------------------------------------------------
?>
<h1 align='center'>Rename MySQL tables </h1>
<p align='center'>for <b>PHP 5</b> (uses mysql functions)</p>
<small>
<p>* Leave "OLD prefix" blank to add a new prefix to all the tables in the database.</p>
<p>* Leave "NEW prefix" blank to remove a prefix from all the tables.</p>
<p>* In both prefixes include all symbols like "_" or "-" etc. since that will be a substring to search and replace.</p>
<p>* Be carefull about spaces!</p>
<p>* Test before do!!!</p>
</small>
<form name="form1" method="post" action="mysql_tables_rename.php">
<table width="70%" border="0" cellspacing="2" cellpadding="2">
<tr>
<td width=50% align='right'>Server address:</td>
<td width=50%><input name="server_addr" type="text" id="server_addr" size="33" value="<?php echo $mysql_server ?>"></td>
</tr>
<tr>
<td align='right'>Database name:</td>
<td><input name="db_name" type="text" id="db_name" size="33" value="<?php echo $mysql_db ?>"></td>
</tr>
<tr>
<td align='right'>Database user:</td>
<td><input name="db_user" type="text" id="db_user" size="33" value="<?php echo $mysql_user ?>"></td>
</tr>
<tr>
<td align='right'>User password:</td>
<td><input name="db_pass" type="password" id="db_pass" size="33" value="<?php echo $mysql_pass ?>"></td>
</tr>
<tr>
<td align='right'>OLD prefix:</td>
<td><input name="prefix_old" type="text" id="prefix_old" size="33" value="<?php echo $prefix_old ?>"></td>
</tr>
<tr>
<td align='right'>NEW prefix:</td>
<td><input name="prefix_new" type="text" id="prefix_new" size="33" value="<?php echo $prefix_new ?>"></td>
</tr>
<tr>
<td></td>
<td><INPUT TYPE="checkbox" NAME="test" checked>Test before execute<br></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" name="Submit" value="Rename tables">
<input name="action" type="hidden" id="action" value="data"></td>
</tr>
</table>
</form>
<?php
//-------------------------------------------------
// Second run. Need to do something: Test or Rename tables
//-------------------------------------------------
if ($action) {
echo "<hr>";
if ( $test_mode ){ // We are in the test mode.
echo "<center><strong>TEST MODE</strong> <br />no changes to database will be made</center>";
}else{
echo "<center><strong>PRODUCTION MODE</strong> <br /> all changes are to be applied to the real database</center>";
}
// Check if any prefix specified
if ((!$prefix_old) & (!$prefix_new)){
die('No prefix specified! Please set OLD or/and NEW prefix');
}
// Connect to MySQL
$link = mysql_connect($mysql_server, $mysql_user, $mysql_pass);
if (!$link) {
die('Could not connect: ' . mysql_error());
}
echo "<p>Successfully connected to: <strong>$mysql_db</strong> at <strong>$mysql_server</strong> </p>";
// Select database and grab table list
mysql_select_db($mysql_db, $link) or die ("Database $mysql_db not found.");
$tables = mysql_list_tables($mysql_db);
// Pull table names into an array and replace prefixes
$i = 0;
while ($i < mysql_num_rows($tables)) {
$table_name = mysql_tablename($tables, $i);
$table_array[$i] = $table_name;
$i++;
}
// Pull table names into another array after replacing prefixes
// See what to do: Add, Replace or Remove prefix?
// ADD prefix, if the field with old prefix is empty
if (($prefix_old=='') & ($prefix_new<>'')){
echo "<strong> Action:</strong> ADD prefix <strong>'$prefix_new'strong> to all table names \n";
foreach ($table_array as $key => $value) {
$table_names[$key] = prefix_add($value, $prefix_new);
}
}else // REMOVE prefix, if the field with new prefix is empty
if (($prefix_old<>'') & ($prefix_new=='')){
echo "<strong> Action:</strong> REMOVE prefix <strong>'$prefix_old'</strong> from all table names \n";
foreach ($table_array as $key => $value) {
$table_names[$key] = prefix_remove($value, $prefix_old);
}
}else{ // REPLACE prefix, if both fields are not empty
echo "<strong> Action:</strong> REPLACE prefix <strong>'$prefix_old'</strong> with <strong>'$prefix_new'</strong> in every matched table name \n";
foreach ($table_array as $key => $value) {
$table_names[$key] = prefix_replace($value, $prefix_old, $prefix_new);
}
}
// Write new table names back
echo "
<DIV ALIGN=CENTER>
<TABLE CELLPADDING=0 CELLSPACING=0 RULES=COLS >
<TR>
<TD><P ALIGN=center><strong>OLD</strong> table name</P></TD>
<TD><P ALIGN=center><strong>New</strong> table name</P></TD>
</TR>
";
$counter_tables = 0;
$counter_no_changed = 0;
$counter_changed = 0;
$counter_failed = 0;
foreach ($table_array as $key => $value) {
$old_name = $table_array[$key];
$new_name = $table_names[$key];
$counter_tables++;
if ( $test_mode ){ // We are in the test mode. Just show new table names
if ($old_name == $new_name){// don't need to rename this table
$message = "<tr><td>-=(no change)=-</td><td>$old_name</td></tr>\n";
$counter_no_changed++;
}else{ // do rename tables
$message = "<tr><td>". $old_name ."</td><td>". $new_name ."</td></tr>\n";
$counter_changed++;
}
}else{
if ($old_name == $new_name){// don't need to rename this table
$message = "<tr><td>-=(no change)=-</td><td>$old_name</td></tr>\n";
}else{ // do rename tables
$query = sprintf('RENAME TABLE %s TO %s', $old_name, $new_name);
$result = mysql_query($query, $link);
if (!$result) {
$error = mysql_error();
$message = "<tr><td><strong>Failed to:</strong> $query </td><td>$error</td></tr>\n";
$counter_failed++;
} else {
$message = "<tr><td>". $old_name ."</td><td>". $new_name ."</td></tr>\n";
$counter_changed++;
}
}
}
echo "$message";
}
echo "</TABLE>
</DIV>
<hr/>
<p></p>
<center><strong>DONE!</strong></center>
<p></p>
<p> Table renaming statistics:<br />
-=- tables : <strong>$counter_tables</strong><br />
-=- changed : <strong>$counter_changed</strong><br />
-=- did not change: <strong>$counter_no_changed</strong><br />
-=- failed : <strong>$counter_failed</strong>
</p>
</BODY>
</HTML>";
// Free the resources
mysql_close($link);
}
//-----------------------------------
// Functions section
//-----------------------------------
function prefix_add($s, $p_new) {
$s = $p_new.$s;
return $s;
}
function prefix_remove($s, $p_old) {
$pos = strpos($s, $p_old);
if ($pos !== false) {
$s = substr($s, $pos + mb_strlen($p_old));
$name_changed = true;
}
return $s;
}
function prefix_replace($s, $p_old, $p_new) {
$pos = strpos($s, $p_old);
if ($pos !== false) {
$s = substr($s, $pos + mb_strlen($p_old));
$s = $p_new.$s;
$name_changed = true;
}
return $s;
}
?>