Массово переименовать таблицы бд MySQL. Php-скрипт

Задача "одна база данных - много сайтов" решается созданием префиксов таблиц, чтобы отличались имена таблиц разных сайтов в одной бд.

Друпал (и другие CMS) при инсталляции предлагает в настройках баз данных указать префикс таблиц. Этот префикс после установки хранится в /sites/default/settings.php в разделе конфигурации базы данных. Если вы собираетесь добавить, изменить префикс имен таблиц, нужно после смены имен таблиц исправить префикс в файле settings.php.

Возможные ошибки: в друпал могут возникать ошибки из-за длинных имён таблиц, если префикс длиннее 4 символов.

Как исправить имена таблиц без скрипта?
Скачайте базу данных, и откройте файл .sql в текстовом редакторе, например, WordPad или Geany (для Линукс) - в том, в котором не будет тормозить открытие большого файла. И сделайте поиск и замену, например, так:

CREATE OR REPLACE TABLE `

заменить на

CREATE OR REPLACE TABLE `prefix_

После правки файла архива бд опять закачайте бд обратно на сервер и не забудьте исправить settings.php, задав префикс в спец поле настроек бд.
Если открытие большого файла тормозит, тогда можно делать из консоли или скриптом.

Префиксы таблиц баз данных можно изменить или добавить префиксы с помощью следующего php-скрипта.

Следующий скрипт соединяется с сервером MySQL и с помощью sql-команды RENAME TABLE меняет имена всех таблиц, в которых найдет pattern, меняя pattern на new pattern. Если pattern не задан (пустая переменная), тогда для всех таблиц баз данных скрипт добавляет в имя префикс new_pattern. При удачном или не удачном переименовании каждой таблицы скрипт выдаёт сообщение.

Скрипт из источника был немного модифицирован. Теперь он работает не только с заменой префикса, но также с добавлением префикса к таблицам без префикса. (Суффиксы не делает.)

Для новичков: замените pattern на существующий префикс или оставьте пустым, а new_pattern - на желаемый новый префикс, например можно использовать префикс d7_ , тогда таблицы будут называться d7_users, d7_variable, d7_fields.

Скрипт можно разместить в корне сайта и запустить 1 раз.

После добавления префиксов вы сможете в одной бд размещать новые и новые таблицы разных сайтов, используя ограниченный хостинг, как удобно. Не забывайте после изменения имён таблиц менять префикс в файле настроек сайта drupal: /sites/default/settings.php

  1. <?php
  2. $db_server = "localhost"; // hostname MySQL server
  3. $db_username = "username"; // username MySQL server
  4. $db_password = "password"; // password MySQL server
  5. $db_name = "database"; // database name
  6.  
  7. $pattern = "prefix"; // search string, can be empty
  8. $new_pattern = "prefix_new"; // replacement string, can be empty
  9.  
  10. // login to MySQL server
  11. $link = mysql_connect( $db_server, $db_username, $db_password);
  12.  
  13. if (!$link)
  14. {
  15. die('Could not connect: ' . mysql_error());
  16. }
  17.  
  18. // list all tables in the database containing the search pattern
  19. $sql = "SHOW TABLES FROM `" . $db_name . "`";
  20. $sql .= " LIKE '%" . $pattern . "%'";
  21.  
  22. $result = mysql_query ( $sql, $link );
  23. if (!$result)
  24. {
  25. die("Invalid query: " . mysql_error( $link ));
  26. }
  27.  
  28. $renamed = 0;
  29. $failed = 0;
  30.  
  31. while ( $row = mysql_fetch_array ($result) )
  32. {
  33. $table_name = $row[0];
  34.  
  35. if (strlen($pattern) > 0 ) {
  36. // rename every table by replacing the search pattern with a new pattern
  37. $new_table_name = str_replace ( $pattern, $new_pattern, $table_name);
  38. } else {
  39. // rename every table by adding a new pattern
  40. $new_table_name = $new_pattern.$table_name;
  41. }
  42.  
  43.  
  44. $sql = "RENAME TABLE `" . $db_name . "`.`" . $table_name . "`";
  45. $sql .= " TO `" . $db_name . "`.`" . $new_table_name . "`";
  46.  
  47. $result_rename = mysql_query ( $sql, $link );
  48. if ($result_rename)
  49. {
  50. echo "Table `" . $table_name . "` renamed to :`";
  51. echo $new_table_name . "`.\n";
  52. $renamed++;
  53. }
  54. else
  55. {
  56. // notify when the renaming failed and show reason why
  57. echo "Renaming of table `" . $table_name . "` has failed: ";
  58. echo mysql_error( $link ) . "\n";
  59. $failed++;
  60. }
  61. }
  62.  
  63. echo $renamed . " tables were renamed, " . $failed . " failed.\n";
  64.  
  65. // close connection to MySQL server
  66. mysql_close( $link );
  67. ?>