මම ඉක්මනින් MySQL දත්ත ගබඩාවක් නැවත නම් කරන්නේ කෙසේද (යෝජනා ක්‍රමයේ නම වෙනස් කරන්න)?


975

දී MySQL අත්පොත MySQL මෙම ආවරණය කරයි.

සාමාන්‍යයෙන් මම දත්ත සමුදාය අතහැර දමා එය නව නමකින් නැවත ආනයනය කරමි. මෙය ඉතා විශාල දත්ත සමුදායන් සඳහා විකල්පයක් නොවේ. පෙනෙන විදිහට RENAME {DATABASE | SCHEMA} db_name TO new_db_name; නරක දේ කරයි, පවතින්නේ අනුවාද අතළොස්සක් තුළ පමණක් වන අතර එය සමස්තයක් වශයෙන් නරක අදහසකි .

මෙය MyISAM ට වඩා වෙනස් ආකාරයකින් ගබඩා කරන InnoDB සමඟ වැඩ කිරීමට අවශ්‍ය වේ .



5
මෙම ප්‍රකාශය RENAME DATABASE සින්ටැක්ස් MySQL 5.1.7 හි එකතු කරන ලද නමුත් එය භයානක බව සොයා ගත් අතර එය MySQL 5.1.23 හි ඉවත් කරන ලදි.
zloctb

12
RENAME DATABASEදැනට මෙම කාර්යය කිරීමට පහසු ක්‍රමයක් නොමැති බැවින් කිසිදු අනතුරක් නොමැති නව ක්‍රියාකාරී ප්‍රකාශයක් MySQL විසින් ක්‍රියාත්මක කරනු ඇතැයි අපේක්‍ෂා කරමු . ප්‍රලේඛනය තුළ එය භයානක වීමට පැහැදිලි හේතුවක් නොමැති බැවින් ඔවුන්ට ප්‍රතිස්ථාපනය කිරීමට හැකි විය යුතුය. අවම වශයෙන් පුද්ගලයින් ඔවුන්ගේ වෙබ් අඩවියේ විශේෂාංග ඉල්ලීම් දෝෂ තබා ඇත. උදාහරණයක් ලෙස, bugs.mysql.com/bug.php?id=58593 සහ bugs.mysql.com/bug.php?id=1698 .
එඩ්වඩ්

සබැඳි දැන් කැඩී ඇත ...
oldboy

Answers:


846

සඳහා InnoDB , පහත සඳහන් වැඩ පෙනේ: පසුව නව දත්ත සමුදාය බවට අනෙක් අතට එක් එක් මේසය නැවත නම් කරන්න, නව හිස් දත්ත සමුදා නිර්මාණය:

RENAME TABLE old_db.table TO new_db.table;

ඊට පසු ඔබට අවසර සකස් කිරීමට අවශ්‍ය වනු ඇත.

කවචයක ස්ක්‍රිප්ට් කිරීම සඳහා, ඔබට පහත සඳහන් දෑ භාවිතා කළ හැකිය:

mysql -u username -ppassword old_db -sNe 'show tables' | while read table; \ 
    do mysql -u username -ppassword -sNe "rename table old_db.$table to new_db.$table"; done

හෝ

for table in `mysql -u root -ppassword -s -N -e "use old_db;show tables from old_db;"`; do mysql -u root -ppassword -s -N -e "use old_db;rename table old_db.$table to new_db.$table;"; done;

සටහන්:

  • විකල්පය -pසහ මුරපදය අතර ඉඩක් නොමැත . ඔබේ දත්ත ගබඩාවට මුරපදයක් නොමැති නම්, -u username -ppasswordකොටස ඉවත් කරන්න .
  • සමහර වගුවලට ප්‍රේරකයක් තිබේ නම්, එය ඉහත ක්‍රමය භාවිතා කර වෙනත් දත්ත ගබඩාවකට ගෙන යා නොහැක ( Trigger in wrong schemaදෝෂයක් ඇති වේ). එය එසේ නම්, දත්ත සමුදායක් ක්ලෝන කිරීමට සාම්ප්‍රදායික ක්‍රමයක් භාවිතා කර පැරණි එක අතහරින්න:

    mysqldump old_db | mysql new_db

  • ඔබ ගබඩා කර ඇති ක්‍රියා පටිපාටි තිබේ නම්, ඔබට පසුව ඒවා පිටපත් කළ හැකිය:

    mysqldump -R old_db | mysql new_db


26
File_per_table සැකසුම භාවිතා කරමින් මම මේස 30+ වගු සහිත InnoDB දත්ත ගබඩාවකින් මෙය කර ඇති අතර සමහර වගු පේළි මිලියන 3+ ක් වුවද එය තත්පර 1 කින් අවසන් විය. වඩා සංකීර්ණ කිසිවක් කිරීමට වඩා එය ගබඩාවේ ගොනු ගෙන යන බවක් පෙනේ ... +2 හැකි නම් :)
ඩේව් රික්ස්

88
"RENAME DATABASE භයානක බව සොයා ගත් අතර එය MySQL 5.1.23 හි ඉවත් කරන ලදි" - dev.mysql.com/doc/refman/5.1/en/rename-database.html
පලනි

13
මෙය දර්ශන සඳහා ක්‍රියා නොකරන බව කරුණාවෙන් සලකන්න. දත්ත සමුදායකින් තවත් තැනකට පනින්නට ඔබට දර්ශන නැවත නම් කළ නොහැක. භාවිතා DROP VIEWකර CREATE VIEWඒ වෙනුවට. අවුල්සහගත, ඔව්. mysqldumpපළමුවෙන්ම සියලු වගු ගෙන ගිය පසු, අදහස් ගෙනයාමට ඔබට අවශ්‍ය විය හැකිය . SHOW TABLESවගු සහ දර්ශන පෙන්වන බව සලකන්න , එබැවින් පරෙස්සම් වන්න.
tuomassalo

9
ප්‍රේරක සහිත කිසිදු වගුවක් සඳහා මෙය ක්‍රියා නොකරනු ඇත. වගුව ගෙනයාමට පෙර ඔබ ප්‍රේරක සොයා ගැනීමට, ඉවත දැමීමට හා අතහැර දැමීමට අවශ්‍යය, ඉන්පසු ඉවතලන ප්‍රේරක ඉලක්ක db වෙත ආනයනය කරන්න.
ඔල්ෆාන්

6
RENAME DATABASEඉවත් කරන ලද්දේ මන්දැයි ලේඛනගත කරන ලද යාවත්කාලීන කරන ලද (එනම් වැඩ කරන) සබැඳිය : dev.mysql.com/worklog/task/?id=4030
ඇලෙක්සිස්

445

මෙම සරල විධානයන් කිහිපයක් භාවිතා කරන්න:

mysqldump -u username -p -v olddatabase > olddbdump.sql
mysqladmin -u username -p create newdatabase
mysql -u username -p newdatabase < olddbdump.sql

I / O අඩු කිරීම සඳහා ab පැබ්ලෝ මැරින්-ගාර්ෂියා යෝජනා කළ පරිදි පහත සඳහන් දෑ භාවිතා කරන්න:

mysqladmin -u username -p create newdatabase
mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase

87
OP පැවසූ පරිදි, "ඔහු ඉතා විශාල දත්ත සමුදායන් සඳහා විකල්පයක් නොවේ."
නියමුවා

3
මුල් දත්ත සමුදාය අතහැර දැමීමට අමතක නොකරන්න
පවෙල් රැඩ්සිවිලොව්ස්කි

3
දීප්තිමත් පිළිතුර! මෙය සියලු හැකියාවන්ගෙන් ගිලිහී යන බැවින් තව දුරටත් වැඩිදියුණු කිරීම සඳහා යෝජනා කිහිපයක්: (1) හොඳම පිළිතුර ලෙස පෙනෙන පරිදි පැබ්ලෝ මැරින්-ගාර්ෂියාගේ කේත කැබැල්ල ඉහළට ගෙනයන්න (2) සෑම තැනකම -p<password>වෙනුවට තබන්න -pඑවිට ප්‍රකාශයන් ක්ෂණිකව නොපෙන්වයි .
ස්ටීව් චේම්බර්ස්

9
පයිප්ප අනුවාදය භාවිතා කිරීමෙන් මට "මුරපදය ඇතුළත් කරන්න:" දෙකක් ලැබෙනු ඇත: Enter password: Enter password: එය එක් මුරපදයක් ගන්නා බව පෙනේ, නමුත් දෙකම නොවේ. මට විස්තරයක් නැතිද?
රයන්

34
කිසිවෙකු මෙය සඳහන් --routinesනොකිරීම ගැන මම පුදුම වෙමි, නමුත් ගබඩා කළ ක්‍රියා පටිපාටි හරහා පිටපත් කර ඇති බව සහතික කිරීම සඳහා ඔබ ඇත්ත වශයෙන්ම ධජය mysqldump විධානයන්ට එක් කළ යුතුය .
කාලෝස් පී

208

මම හිතන්නේ විසඳුම සරල වන අතර සමහර සංවර්ධකයින් විසින් යෝජනා කරන ලදී. phpMyAdmin මේ සඳහා මෙහෙයුමක් ඇත.

PhpMyAdmin වෙතින්, ඔබට තෝරා ගැනීමට අවශ්‍ය දත්ත සමුදාය තෝරන්න. ටැබ් වල මෙහෙයුම් යනුවෙන් හැඳින්වෙන එකක් තිබේ, නැවත නම් කිරීමේ අංශයට යන්න. එච්චරයි.

එය බොහෝ දෙනා යෝජනා කළ පරිදි, නව නම සමඟ නව දත්ත සමුදායක් නිර්මාණය කරයි, පැරණි දත්ත ගබඩාවේ සියලුම වගු නව දත්ත ගබඩාවට දමා පැරණි දත්ත සමුදාය අතහැර දමයි.

රූප විස්තරය මෙහි ඇතුළත් කරන්න


76
ඔබේ පරිසරය පිළිබඳ php පවා ඇති බව උපකල්පනය කිරීම හෝ phpmyadmin භාවිතා කිරීම.
ක්‍රිස්

27
ඔබට phpMyAdmin තිබුනද එය ඉතා භයානකයි - පසුපස කෙළවර මැද ක්‍රියාවලිය අසාර්ථක විය හැකි අතර එමගින් ඩබ් දෙක නොදන්නා තත්වයකට පත්වේ, නැතහොත් එය ඉතා දිගු කාලයක් ගතවනු ඇත, එය ඉදිරිපස කෙළවරේ එල්ලීම හෝ PHP කාලය ඉකුත්වීමට හේතු වේ.
mozboz

20
එය ඇත්ත @ මොස්බොස්, නමුත් මම මෙය වසර 10 ක් තිස්සේ කර ඇති අතර කිසි විටෙකත් එම ගැටලුව නොතිබුණි. ඔබ විධානය ෂෙල් එකක් හරහා ධාවනය කර පරිගණකය බිඳ වැටේ නම් එය එසේම වේ. හැකියාවක් ඇත නමුත් කුමක් ද? චතුරස්රාකාර 1 සිට 1 දක්වා?
රාෆි

24
කොන්සෝලය හරහා ස්ක්‍රිප්ටයක් යනු එකම ගැටලු සමඟ එල්ලිය හැකි ඉදිරිපස අන්තයකි.
ග්‍රෙග්

11
එහෙත් කොන්සෝල මෙහෙයුම් PhpMyAdmin ට වඩා බෙහෙවින් විශ්වාසදායකය, විශේෂයෙන් විශාල දත්ත සමුදායන් සම්බන්ධ වන විට OP හි තත්වය එයයි. ඔබට සෑහෙන තරම් විශාල දත්ත සමුදායක් තිබේ නම් පුද්ගලිකව මම පීඑම්ඒ වෙනුවට ඕනෑම කොන්සෝල ක්‍රමයක් යෝජනා කරමි. කුඩා දත්ත සමුදායන්හි පීඑම්ඒ ද හොඳ බව අමුතුවෙන් කිව යුතු නැත.
ටියෝඩර් සඳු

109

ඔබේ මූලාශ්‍ර දත්ත ගබඩාවේ සෑම වගුවක්ම ගමනාන්ත දත්ත ගබඩාවට මාරු කිරීම සඳහා SQL පිටපතක් ජනනය කිරීමට ඔබට SQL භාවිතා කළ හැකිය.

විධානයෙන් ජනනය කරන ලද ස්ක්‍රිප්ට් ධාවනය කිරීමට පෙර ඔබ ගමනාන්ත දත්ත ගබඩාව නිර්මාණය කළ යුතුය.

ඔබට මෙම ස්ක්‍රිප්ට් දෙකෙන් එකක් හෝ භාවිතා කළ හැකිය (මම මුලින් යෝජනා කළේ කලින් සහ වෙනත් අයෙකු මගේ පිළිතුර භාවිතා කිරීමට “වැඩිදියුණු” කර ඇත GROUP_CONCAT. ඔබේ තේරීම ගන්න, නමුත් මම මුල් පිටපතට කැමතියි):

SELECT CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name, '; ')
FROM information_schema.TABLES 
WHERE table_schema='$1';

හෝ

SELECT GROUP_CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name SEPARATOR '; ')
FROM information_schema.TABLES 
WHERE table_schema='$1';

($ 1 සහ $ 2 පිළිවෙලින් ප්‍රභවය සහ ඉලක්කය වේ)

මෙය ඔබට ක්‍රියාත්මක කිරීමට අවශ්‍ය SQL විධානයක් ජනනය කරනු ඇත.

GROUP_CONCATවගු විශාල සංඛ්‍යාවක් ඇති දත්ත සමුදායන් සඳහා ඉක්මවා යා හැකි පෙරනිමි දිග සීමාවක් ඇති බව සලකන්න . ධාවනය කිරීමෙන් ඔබට එම සීමාව වෙනස් කළ හැකිය SET SESSION group_concat_max_len = 100000000;(හෝ වෙනත් විශාල සංඛ්‍යාවක්).


LaBlakeFrederick එය RENAME DATABASE භාවිතා නොකරයි, එබැවින් ගැටලුව කුමක්ද?
tuxayo

වගුවට යොමු කිරීමේ සීමාවන් තිබේ නම් මෙය ක්‍රියාත්මක වේද? මම බලාපොරොත්තු නොවෙමි.
ඩොල්මන්

47

RENAME DATABASEMySQL හි නැතිවූ විධානය අනුකරණය කිරීම :

  1. නව දත්ත සමුදායක් සාදන්න
  2. සමඟ නැවත නම් කිරීමේ විමසුම් සාදන්න:

    SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
        ' TO ','new_schema.',table_name,';')
    FROM information_schema.TABLES
    WHERE table_schema LIKE 'old_schema';
  3. එම ප්‍රතිදානය ක්‍රියාත්මක කරන්න

  4. පැරණි දත්ත සමුදාය මකන්න

එය ගනු ලැබුවේ MySQL හි අතුරුදහන් වූ RENAME DATABASE විධානය අනුකරණය කිරීමෙනි .


1
පරිපූර්ණ! මම මෙය InnoDB සහ MyISAM වගු සමඟ පරීක්ෂා කළෙමි. මම පරීක්ෂා කළ වේගවත්ම විසඳුම (මේසය නැවත නම් කිරීම ක්ෂණිකයි, ප්‍රමාදයක් නැත)!
පිලිප්

මහා! වරප්‍රසාද පසුව සකස් කිරීමට මතක තබා ගන්න.
ඇඩම් ෆරීනා

ps. ඔබ සජීවී ඩීබී මත වැඩ කරන්නේ නම් නැවත නම් කිරීමේ විමසුම් ක්‍රියාත්මක කිරීමට පෙර මෙය කිරීම හොඳය.
ඇඩම් ෆරීනා

වගුවට යොමු කිරීමේ සීමාවන් තිබේ නම් මෙය ක්‍රියාත්මක වේද? මම බලාපොරොත්තු නොවෙමි.
ඩොල්මන්

24

විකල්ප තුනක්:

  1. නව දත්ත සමුදාය සාදන්න, සේවාදායකය පහළට ගෙන ඒම, එක් දත්ත සමුදා ෆෝල්ඩරයක සිට අනෙක් ලිපිගොනු වෙත ගෙන යාම සහ සේවාදායකය නැවත ආරම්භ කිරීම. මෙය ක්‍රියාත්මක වන්නේ ඔබගේ සියලු වගු MyISAM නම් පමණි.

  2. නව දත්ත සමුදාය සාදන්න, CREATE TABLE ... LIKE ප්‍රකාශ භාවිතා කරන්න, ඉන්පසු INSERT ... SELECT * FROM ප්‍රකාශ භාවිතා කරන්න.

  3. Mysqldump භාවිතා කර එම ගොනුව සමඟ නැවත පූරණය කරන්න.


+ මයිසාම් යොමුව සඳහා. මෙය මට වැඩ නොකළේ මන්දැයි මට සිතාගත නොහැකි විය.
ක්‍රිස්ටියන් පේන්

5
ප්‍රශ්නයේ සඳහන් වන්නේ මෙය ක්‍රියාත්මක විය යුත්තේ InnoDB සඳහා මිස MyISAM
D-Rock

@ ඩී-රොක් එය ගූගල් වෙත පවසන්න, මාතෘකාව මත පදනම්ව මිනිසුන් මෙහි ගෙන එයි.
jiggunjer

24

සරල ක්‍රමය

දත්ත සමුදා නාමාවලියට වෙනස් කරන්න:

cd /var/lib/mysql/

MySQL වසා දමන්න ... මෙය වැදගත් ය!

/etc/init.d/mysql stop

හරි, මේ ආකාරයෙන් InnoDB හෝ BDB-Databases සඳහා ක්‍රියා නොකරයි.

දත්ත සමුදාය නැවත නම් කරන්න:

mv old-name new-name

... හෝ මේසය ...

cd database/

mv old-name.frm new-name.frm

mv old-name.MYD new-name.MYD

mv old-name.MYI new-name.MYI

MySQL නැවත ආරම්භ කරන්න

/etc/init.d/mysql start

කළා ...

හරි, මේ ආකාරයෙන් InnoDB හෝ BDB දත්ත සමුදායන් සමඟ ක්‍රියා නොකරයි. මෙම අවස්ථාවේදී ඔබට දත්ත සමුදාය ඉවත දමා නැවත ආනයනය කළ යුතුය.


17
ෆෝල්ඩර නැවත නම් කිරීම සෙල්ලම් බඩු බිඳ දමයි.
විනිසියස්පයර්ස්

1
Ah රාහ්ලි, එක් වගුවකට එක් ගොනුවක් සකසා තිබුණද, එය තවමත් භයානක ය, එක් කොඩියකට එක් ගොනුවක් සැකසීමට පෙර සාදන ලද වගු කරදරයට පත්වනු ඇත, එම ධජය සැකසීමෙන් පසුව දත්ත සමුදාය නිර්මාණය වී ඇති බව ඔබ නොදන්නේ නම් පමණි.
Qian Chen

පොදුවේ ගත් කල, බොහෝ මිනිසුන් ඔවුන්ගේ පද්ධති එක් ආකාරයකින් හෝ වෙනත් ආකාරයකින් ලබා ගැනීමට යන්නේ, මිනිසුන් එක් ගොනුවකට එක් වගුවක් තිබිය යුතුද නැද්ද යන්න අහඹු ලෙස පෙරළීමට යන්නේ නැත. ඊට අමතරව, ඔබේ තත්වය තුළ පවා, ධජයට පෙර වගු නිර්මාණය කර ඇත්නම්, ඒවා මුලින් වෙනම ලිපිගොනු ලෙස නොපවතින බැවින් එම පියවර ක්‍රියාත්මක නොවන අතර එය තවමත් ආරක්ෂිතයි, අනතුරක් නැත. මතක තබා ගන්න, චලනය සිදුවන විට දත්ත සමුදාය ක්‍රියාත්මක නොවේ.
රාහුලි

OS X හි launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist cd /usr/local/var/mysql mv old-name new-name launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
හෝම්බ rew

24

ඔබට මෙම ෂෙල් ස්ක්‍රිප්ට් භාවිතා කළ හැකිය:

යොමුව: MySQL දත්ත සමුදායක් නැවත නම් කරන්නේ කෙසේද?

#!/bin/bash
set -e # terminate execution on command failure

mysqlconn="mysql -u root -proot"
olddb=$1
newdb=$2
$mysqlconn -e "CREATE DATABASE $newdb"
params=$($mysqlconn -N -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES \
                           WHERE table_schema='$olddb'")
for name in $params; do
      $mysqlconn -e "RENAME TABLE $olddb.$name to $newdb.$name";
done;
$mysqlconn -e "DROP DATABASE $olddb"

එය වැඩකරනවා:

$ sh rename_database.sh oldname newname

6
මේ ගැන සැලකිලිමත් වන්න. ඔබ root පරිශීලකයා සමඟ ලොග් නොවන්නේ නම්, ඔබට සීමිත අවසරයක් තිබිය හැකිය. නැවත නම් කිරීම අසාර්ථක වීමට හේතු වන නමුත් සාර්ථක වීමට වැටීම හේතුවෙන් දත්ත සමුදාය පහත වැටේ. වෙනත් ආකාරයකින් හොඳ පිටපතක්.
ලෙක්ස්

3
මම set -eස්ක්‍රිප්ටයේ ආරම්භයට එකතු කළ අතර එය ක්‍රියාත්මක කිරීම අසාර්ථක වීමෙන් අවසන් වන අතර එම ගැටළුව අවම කළ යුතුය.
මිකෙල්

19

මම මෑතකදී එය කිරීමට ඉතා හොඳ ක්‍රමයක් හමු වී, MyISAM සහ InnoDB සමඟ වැඩ කරන අතර ඉතා වේගවත් ය:

RENAME TABLE old_db.table TO new_db.table;

මා එය කියවූ ස්ථානය මට මතක නැත, නමුත් ගෞරවය හිමිවන්නේ මා නොව වෙනත් කෙනෙකුට ය.


අර්කාඩිජ් කුෂෙල් එසේ සිතන්නේ නැත. මම හිතන්නේ ඔබ කතා කරන්නේ RENAME DATABASE ගැනයි.
රොබ් ග්‍රාන්ට්

මෙය සැබවින්ම උපකාරී විය, මම නව හිස් දත්ත ගබඩාවක් නිර්මාණය කර කේතය භාවිතා කළෙමි, සියලු වගු අපේක්ෂිත නම් සමඟ ආනයනය කරන ලදි.
ජූලි ඕර්ඩිනරි

3
පිළිගත් පිළිතුරට සමාන ගැටලුවකින් මෙය පීඩා විඳිති - "RENAME DATABASE භයානක බව සොයා ගත් අතර එය MySQL 5.1.23 හි ඉවත් කරන ලදි" - dev.mysql.com/doc/refman/5.1/en/rename-database.html වෙතින්
බ්ලේක් ෆ්‍රෙඩ්රික්

16

සම්පූර්ණ නම් කිරීමක් කිරීමේ සරලම වෙඩි නොවදින-මෝඩ-ඔප්පු ක්‍රමය (පැරණි දත්ත සමුදාය අවසානයේ අතහැර දැමීම ඇතුළුව එය පිටපතකට වඩා නැවත නම් කිරීමකි) :

mysqladmin -uroot -pmypassword create newdbname
mysqldump -uroot -pmypassword --routines olddbname | mysql -uroot -pmypassword newdbname
mysqladmin -uroot -pmypassword drop olddbname

පියවර:

  1. පේළි නොට්පෑඩ් වෙත පිටපත් කරන්න.
  2. "Olddbname", "newdbname", "mypassword" (+ විකල්ප වශයෙන් "root") සඳහා වන සියලුම යොමු ඔබගේ සමානකම් සමඟ ප්‍රතිස්ථාපනය කරන්න.
  3. විධාන රේඛාවේ එකින් එක ක්‍රියාත්මක කරන්න (විමසූ විට "y" ඇතුලත් කරන්න).

ඔබගේ මුරපදය ආරක්ෂිත නොවන බැවින් කොන්සෝලය වෙත එක් කිරීමෙන් වළකින්න. ඔබ මෙය සිදු කර ඇත්නම් ඉවත් කිරීමට ඉතිහාසය -cw භාවිතා කරන්න. ඒ වෙනුවට මුරපදය හිස්ව තබා විමසුමට පසුව එය ඇතුළත් කරන්න.
ටොමී සී.

එය නිම නොකර අසාමාන්‍ය ලෙස දිගු, මිනිත්තු 20 කට වඩා ගත වේ. අවලංගු කිරීම හරිද?
සිගු මැග්වා

15

මම භාවිතා කරන්නේ මෙයයි:

$ mysqldump -u root -p olddb >~/olddb.sql
$ mysql -u root -p
mysql> create database newdb;
mysql> use newdb
mysql> source ~/olddb.sql
mysql> drop database olddb;

14
විශාල දත්ත සමුදායන් සඳහා කළ නොහැක.
mikesl

14

මේ මොහොතේ දත්ත සමුදායක් එහි විධාන අතුරුමුහුණත හරහා නම් කිරීම සඳහා MySQL සහාය නොදක්වයි, නමුත් ඔබට MySQL එහි දත්ත සමුදායන් ගබඩා කරන නාමාවලියට ප්‍රවේශය ඇත්නම් දත්ත සමුදාය නැවත නම් කළ හැකිය. පෙරනිමි MySQL ස්ථාපනයන් සඳහා මෙය සාමාන්‍යයෙන් MySQL ස්ථාපනය කරන ලද නාමාවලිය යටතේ ඇති දත්ත නාමාවලියෙහි ඇත. දත්ත නාමාවලිය යටතේ ඔබට නම් කිරීමට අවශ්‍ය දත්ත සමුදායේ නම සොයාගෙන එය නැවත නම් කරන්න. නාමාවලිය නැවත නම් කිරීම සමහර අවසර ගැටළු වලට හේතු විය හැක. පරීක්ෂාකාරී වන්න.

සටහන: දත්ත සමුදාය නැවත නම් කිරීමට පෙර ඔබ MySQL නැවැත්විය යුතුය

නව දත්ත සමුදායක් නිර්මාණය කිරීමට මම නිර්දේශ කරමි (ඔබට අවශ්‍ය නම භාවිතා කරමින්) සහ ඔබට අවශ්‍ය දත්ත පැරණි සිට නව දක්වා අපනයනය / ආනයනය කිරීම. හරිම සරලයි.


14

පියවර :

  1. පහර http: // localhost / phpMyAdmin /
  2. ඔබේ ඩීබී තෝරන්න
  3. මෙහෙයුම් පටිත්ත ක්ලික් කරන්න
  4. "දත්ත සමුදාය නැවත නම් කරන්න" ලෙස ටැබ් එකක් ඇත. නව නමක් එකතු කර වරප්‍රසාද සකසන්න.
  5. Go මත ක්ලික් කරන්න.

රූප විස්තරය මෙහි ඇතුළත් කරන්න


2
සමහර පරිසරවල පරිසරය සීමා කර ඇති බැවින් phpMyAdmin විසඳුමක් සාමාන්‍යයෙන් දුර්වල විසඳුමකි.
ඩැනියෙල් ඇන්ටූන්ස් පින්ටෝ

"හොඳ" විසඳුමක් නොව, මා සොයන දේට වඩා අඩු කිසිවකට ස්තූතියි.
ජමී

1
එය ඔබ වෙනුවෙන් වැඩ කරන්නේ නම් කරුණාකර ඡන්දය දෙන්න .. එය උපකාරී වනු ඇත .. ස්තූතියි
ශුභාම් ජේන්

1
මෙය මට වැඩ කරන්නේ, phpMyAdmin පරිසරය තුළ, +1
විලියම්

13

ඔබ PHPMyAdmin හි දත්ත සමුදායක් නැවත නම් කරන විට එය ඩම්ප් එකක් සාදයි, පසුව නව නම සමඟ දත්ත සමුදාය බිම දමා ප්‍රතිනිර්මාණය කරයි.


4
ඔබ දත්ත සමුදාය මත ක්ලික් කරන විට මෙම අංගය "මෙහෙයුම්" පටිත්ත යටතේ ටිකක් සැඟවී ඇති බව සලකන්න.
මාරිස් බී

13

ක්‍රම 2 ක් ඇත:

ක්රමය 1: දත්ත සමුදාය නැවත නම් කිරීම සඳහා ප්රසිද්ධ ක්රමයක් නම්, මයික්ල්ඩම්ප් භාවිතයෙන් යෝජනා ක්රමය ඉවත දමා වෙනත් ක්රමයකට ප්රතිස්ථාපනය කිරීම, පසුව පැරණි යෝජනා ක්රමය අතහැර දැමීම (අවශ්ය නම්).

ෂෙල් වෙතින්

 mysqldump emp > emp.out
 mysql -e "CREATE DATABASE employees;"
 mysql employees < emp.out 
 mysql -e "DROP DATABASE emp;"

ඉහත ක්‍රමය පහසු වුවද එය කාලය හා අවකාශය වැය කරයි. ක්‍රමාංකය 100GB ට වඩා වැඩි නම් කුමක් කළ යුතුද?අවකාශය ඉතිරි කර ගැනීම සඳහා ඉහත විධානයන් එකට සම්බන්ධ කළ හැකි ක්‍රම තිබේ, කෙසේ වෙතත් එය කාලය ඉතිරි නොකරයි.

එවැනි තත්වයන්ට පිළියමක් ලෙස, ක්‍රමෝපායන් නැවත නම් කිරීම සඳහා තවත් ඉක්මන් ක්‍රමවේදයක් ඇත, කෙසේ වෙතත්, එය සිදු කිරීමේදී යම්කිසි සැලකිල්ලක් දැක්විය යුතුය.

ක්රමය 2: විවිධ යෝජනා ක්රම හරහා පවා ක්රියාත්මක වන වගු නැවත නම් කිරීම සඳහා MySQL සතුව ඉතා හොඳ අංගයක් ඇත. මෙම නැවත නම් කිරීමේ මෙහෙයුම පරමාණුක වන අතර එය නැවත නම් කරන අතරතුර වෙනත් කිසිවෙකුට මේසයට ප්‍රවේශ විය නොහැක. වගුවක නමක් හෝ එහි සැලැස්ම වෙනස් කිරීම පාර-දත්ත වෙනසක් පමණක් බැවින් මෙය සම්පූර්ණ කිරීමට කෙටි කාලයක් ගතවේ. නැවත නම් කිරීම සඳහා කාර්ය පටිපාටික ප්‍රවේශය මෙන්න:

අපේක්ෂිත නම සමඟ නව දත්ත සමුදාය නිර්මාණය කරන්න. MySQL හි “RENAME TABLE” විධානය භාවිතා කරමින් පැරණි යෝජනා ක්‍රමයේ සිට නව යෝජනා ක්‍රමයට වගු නැවත නම් කරන්න. පැරණි දත්ත සමුදාය යෝජනා ක්‍රමය අතහරින්න. If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too. වගු වල ප්‍රේරක තිබේ නම් MySQL හි “RENAME TABLE” අසමත් වේ. මෙයට පිළියමක් ලෙස අපට පහත සඳහන් දෑ කළ හැකිය:

1) Dump the triggers, events and stored routines in a separate file. මෙය සිදු කරනුයේ -E, -R ධජ (-t -d ට අමතරව ප්‍රේරක ඇද දමයි) mysqldump විධානයට ය. ප්‍රේරක ඉවත දැමූ පසු, RENAME TABLE විධානය ක්‍රියාත්මක වීම සඳහා අපි ඒවා ක්‍රමයෙන් ඉවත් කළ යුතුය.

 $ mysqldump <old_schema_name> -d -t -R -E > stored_routines_triggers_events.out

2) “BASE” වගු පමණක් ලැයිස්තුවක් සාදන්න. information_schema.TABLESමේසය මත විමසුමක් භාවිතයෙන් මේවා සොයාගත හැකිය .

 mysql> select TABLE_NAME from information_schema.tables where 
    table_schema='<old_schema_name>' and TABLE_TYPE='BASE TABLE';

3) පිටත ගොනුවක දර්ශන දමන්න. එකම information_schema.TABLESවගුවේ විමසුමක් භාවිතා කර දර්ශන සොයාගත හැකිය .

mysql> select TABLE_NAME from information_schema.tables where 
   table_schema='<old_schema_name>' and TABLE_TYPE='VIEW';
 $ mysqldump <database> <view1> <view2>  > views.out

4) පැරණි_චේමා හි වත්මන් වගු මත ප්‍රේරක දමන්න.

mysql> DROP TRIGGER <trigger_name>;
...

5) # 2 පියවරෙහි ඇති සියලුම “මූලික” වගු නැවත නම් කිරීමෙන් පසු ඉහත ඩම්ප් ගොනු ප්‍රතිස්ථාපනය කරන්න.

mysql> RENAME TABLE <old_schema>.table_name TO <new_schema>.table_name;
...
$ mysql <new_schema> < views.out
$ mysql <new_schema> < stored_routines_triggers_events.out

ඉහත ක්‍රම සමඟ ඇති සංකීර්ණතා: නිවැරදි ක්‍රමලේඛ නාමයට ගැලපෙන පරිදි පරිශීලකයින් සඳහා අපට ප්‍රදාන යාවත්කාලීන කිරීමට අවශ්‍ය විය හැකිය. මේවා mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db යන වගුවල සරල යාවත්කාලීනයකින් සවි කළ හැකිය. “2 වන ක්‍රමය” “ක්‍රම 1” ට වඩා ටිකක් සංකීර්ණ බව පෙනුනද, මෙය මුළුමනින්ම ස්ක්‍රිප්ට් කළ හැකිය. ඉහත පියවර නිසි අනුපිළිවෙලින් සිදු කිරීම සඳහා සරල බාෂ් ස්ක්‍රිප්ට් එකක් මඟින් ඊළඟ වතාවේ දත්ත සමුදායන් නැවත නම් කිරීමේදී අවකාශය හා කාලය ඉතිරි කර ගත හැකිය.

පර්කෝනා දුරස්ථ ඩී.බී.ඒ කණ්ඩායම “rename_db” නමින් පිටපතක් ලියා ඇති අතර එය පහත පරිදි ක්‍රියා කරයි:

[root@dba~]# /tmp/rename_db
rename_db <server> <database> <new_database>

මෙම ස්ක්‍රිප්ටයේ භාවිතය නිරූපණය කිරීම සඳහා, “එම්පී” නියැදි ක්‍රමයක් භාවිතා කර, පරීක්ෂණ ප්‍රේරක නිර්මාණය කර, එම ක්‍රමවේදය මත ගබඩා කර ඇති ක්‍රියාකාරකම්. ස්ක්‍රිප්ට් භාවිතයෙන් දත්ත සමුදාය නැවත නම් කිරීමට උත්සාහ කරනු ඇත, එය කාලය ගතවන ඩම්ප් / ප්‍රතිස්ථාපන ක්‍රමයට පටහැනිව සම්පූර්ණ කිරීමට තත්පර කිහිපයක් ගත වේ.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| emp                |
| mysql              |
| performance_schema |
| test               |
+--------------------+


[root@dba ~]# time /tmp/rename_db localhost emp emp_test
create database emp_test DEFAULT CHARACTER SET latin1
drop trigger salary_trigger
rename table emp.__emp_new to emp_test.__emp_new
rename table emp._emp_new to emp_test._emp_new
rename table emp.departments to emp_test.departments
rename table emp.dept to emp_test.dept
rename table emp.dept_emp to emp_test.dept_emp
rename table emp.dept_manager to emp_test.dept_manager
rename table emp.emp to emp_test.emp
rename table emp.employees to emp_test.employees
rename table emp.salaries_temp to emp_test.salaries_temp
rename table emp.titles to emp_test.titles
loading views
loading triggers, routines and events
Dropping database emp

real    0m0.643s
user    0m0.053s
sys     0m0.131s


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| emp_test           |
| mysql              |
| performance_schema |
| test               |
+--------------------+

ඉහත නිමැවුමෙන් ඔබට දැකිය හැකි පරිදි, “එම්පී” යන දත්ත සමුදාය තත්පරයකට අඩු කාලයකින් “එම්පී_ටෙස්ට්” ලෙස නම් කරන ලදී. අවසාන වශයෙන්, මෙය “ක්‍රමය 2 for” සඳහා ඉහත භාවිතා කරන පර්කෝනාහි පිටපතයි.

#!/bin/bash
# Copyright 2013 Percona LLC and/or its affiliates
set -e
if [ -z "$3" ]; then
    echo "rename_db <server> <database> <new_database>"
    exit 1
fi
db_exists=`mysql -h $1 -e "show databases like '$3'" -sss`
if [ -n "$db_exists" ]; then
    echo "ERROR: New database already exists $3"
    exit 1
fi
TIMESTAMP=`date +%s`
character_set=`mysql -h $1 -e "show create database $2\G" -sss | grep ^Create | awk -F'CHARACTER SET ' '{print $2}' | awk '{print $1}'`
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
STATUS=$?
if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then
    echo "Error retrieving tables from $2"
    exit 1
fi
echo "create database $3 DEFAULT CHARACTER SET $character_set"
mysql -h $1 -e "create database $3 DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h $1 $2 -e "show triggers\G" | grep Trigger: | awk '{print $2}'`
VIEWS=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='VIEW'" -sss`
if [ -n "$VIEWS" ]; then
    mysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dump
fi
mysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dump
for TRIGGER in $TRIGGERS; do
    echo "drop trigger $TRIGGER"
    mysql -h $1 $2 -e "drop trigger $TRIGGER"
done
for TABLE in $TABLES; do
    echo "rename table $2.$TABLE to $3.$TABLE"
    mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"
done
if [ -n "$VIEWS" ]; then
    echo "loading views"
    mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dump
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
    echo "Dropping database $2"
    mysql -h $1 $2 -e "drop database $2"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; then
    COLUMNS_PRIV="    UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; then
    PROCS_PRIV="    UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; then
    TABLES_PRIV="    UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; then
    DB_PRIV="    UPDATE mysql.db set db='$3' WHERE db='$2';"
fi
if [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; then
    echo "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"
    if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fi
    if [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fi
    if [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fi
    if [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fi
    echo "    flush privileges;"
fi

යොමු අවහිරතා ගැන කුමක් කිව හැකිද?
ඩොල්මන්

12

මැක් භාවිතා කරන්නන් සඳහා, සීකුවෙල් ප්‍රෝ හි දත්ත සමුදා මෙනුවේ නැවත නම් කිරීමේ දත්ත සමුදා විකල්පයක් ඇත. http://www.afetelpro.com/


5
ඔබේ දත්ත ගබඩාවේ යම් අදහස් හෝ ප්‍රේරක තිබේ නම් මෙම විකල්පය ගැන පරිස්සම් වන්න. මෙම මෙනු විකල්පයට පිටුපසින් නව දත්ත සමුදායක් නිර්මාණය කර සියලු වගු ඉහළට ගෙන යන ස්ක්‍රිප්ටයක් ඇත. මෙය දර්ශන හෝ ප්‍රේරක සඳහා ක්‍රියා නොකරනු ඇත, එබැවින් ඒවා ඔබගේ පැරණි දත්ත ගබඩාවේ ඉතිරි වේ. ප්‍රති result ලය වන්නේ නිවැරදි කිරීමට අවශ්‍ය බිඳුණු දත්ත සමුදායන් දෙකකි.
ඔල්ෆාන්

10

මෙහි බොහෝ පිළිතුරු හේතු දෙකෙන් එකක් වැරදියි:

  1. ඔබට RENAME TABLE භාවිතා කළ නොහැක, මන්ද දර්ශන සහ ප්‍රේරක තිබිය හැක. ප්‍රේරක තිබේ නම්, RENAME TABLE අසමත් වේ
  2. ඔබට "ඉක්මණින්" (ප්‍රශ්නයේ ඉල්ලූ පරිදි) විශාල දත්ත ගබඩාවක් නැවත නම් කිරීමට අවශ්‍ය නම් ඔබට mysqldump භාවිතා කළ නොහැක

මෙය හොඳින් කරන්නේ කෙසේද යන්න ගැන පර්කෝනාට බ්ලොග් සටහනක් ඇත: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/

සහ පිටපත සයිමන් ආර් ජෝන්ස් විසින් පළ කරන ලද (සාදන ලද?) එම ලිපියේ යෝජනා කර ඇති දේ කරයි. මම පිටපතෙහි සොයාගත් දෝෂයක් නිවැරදි කළෙමි. ඔබට එය මෙහි දැකිය හැකිය:

https://gist.github.com/ryantm/76944318b0473ff25993ef2a7186213d

මෙන්න එහි පිටපතක්:

#!/bin/bash
# Copyright 2013 Percona LLC and/or its affiliates
# @see https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/
set -e
if [ -z "$3" ]; then
    echo "rename_db <server> <database> <new_database>"
    exit 1
fi
db_exists=`mysql -h $1 -e "show databases like '$3'" -sss`
if [ -n "$db_exists" ]; then
    echo "ERROR: New database already exists $3"
    exit 1
fi
TIMESTAMP=`date +%s`
character_set=`mysql -h $1 -e "SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = '$2'" -sss`
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
STATUS=$?
if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then
    echo "Error retrieving tables from $2"
    exit 1
fi
echo "create database $3 DEFAULT CHARACTER SET $character_set"
mysql -h $1 -e "create database $3 DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h $1 $2 -e "show triggers\G" | grep Trigger: | awk '{print $2}'`
VIEWS=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='VIEW'" -sss`
if [ -n "$VIEWS" ]; then
    mysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dump
fi
mysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dump
for TRIGGER in $TRIGGERS; do
    echo "drop trigger $TRIGGER"
    mysql -h $1 $2 -e "drop trigger $TRIGGER"
done
for TABLE in $TABLES; do
    echo "rename table $2.$TABLE to $3.$TABLE"
    mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"
done
if [ -n "$VIEWS" ]; then
    echo "loading views"
    mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dump
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
    echo "Dropping database $2"
    mysql -h $1 $2 -e "drop database $2"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; then
    COLUMNS_PRIV="    UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; then
    PROCS_PRIV="    UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; then
    TABLES_PRIV="    UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; then
    DB_PRIV="    UPDATE mysql.db set db='$3' WHERE db='$2';"
fi
if [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; then
    echo "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"
    if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fi
    if [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fi
    if [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fi
    if [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fi
    echo "    flush privileges;"
fi

එය නමින් හැඳින්වෙන ගොනුවකට සුරකින්න rename_dbසහ ස්ක්‍රිප්ට් ක්‍රියාත්මක කළ හැකි පරිදි chmod +x rename_dbඑය භාවිතා කරන්න./rename_db localhost old_db new_db


මම මෙම පිටපතට කැමතියි, එය පාහේ විශ්වීය ය. කෙසේ වෙතත්, නිශ්චිත මූලයක් නොමැති දම්වැල් සහිත දර්ශන කිහිපයක් ඇති විට එය සැකසීමට අසමත් විය.
ENargit කරන්න

9

සම්පුර්ණ ඩම්ප් එකක් කර නැවත පිහිටුවීමකින් තොරව දත්ත සමුදායක් තුළ ඇති සියලුම වගු වෙනත් දත්ත සමුදායක් යටතේ නම් කිරීම කළ හැකිය.

EXISTS mysql.rename_db නම් ක්‍රියා පටිපාටිය අතහරින්න;
ඩෙලිමිටර් ||
ක්‍රියා පටිපාටිය සාදන්න mysql.rename_db (පැරණි_ඩීබී වර්චාර් (100), නව_ඩීබී වර්චාර් (100))
ආරම්භය
CONCAT තෝරන්න ('දත්ත සමුදාය සාදන්න', new_db, ';') `# නව දත්ත සමුදායක් සාදන්න`;
CONCAT තෝරන්න ('RENAME TABLE `', old_db, '` .`', table_name, '`TO`', new_db, '` .`', table_name, '`; table_schema = old_db;
CONCAT තෝරන්න ('දත්ත සමුදාය අතහරින්න', old_db, '`;')` # පැරණි දත්ත සමුදාය අතහරින්න`;
END ||
ඩිලිමිටර්;

$ time mysql -uroot -e "mysql.rename_db අමතන්න ('db1', 'db2');" | mysql -uroot

කෙසේ වෙතත්, ඉලක්කය db හි ඇති ඕනෑම ප්‍රේරකයක් සතුටු නොවනු ඇත. ඔබට පළමුව ඒවා අතහැර දැමිය යුතු අතර නැවත නම් කිරීමෙන් පසුව ඒවා නැවත ප්‍රතිනිර්මාණය කළ යුතුය.

mysql -uroot -e "mysql.rename_db අමතන්න ('පරීක්ෂණය', 'blah2');" | mysql -uroot
4 වන පේළියේ දෝෂය 1435 (HY000): වැරදි ක්‍රමෝපායන් ක්‍රියාත්මක කරන්න

කුඩා වෙනස් කිරීම් මඟින් මෙම කාර්යය w / mysql 5.x mysql --batch-uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot සැලකිල්ලට ගන්න, ඔබ ආකෘතිකරණය අමු ආකෘතිකරණයට වෙනස් කිරීමට --batch භාවිතා කළ යුතු අතර එමඟින් ප්‍රති / ල w / ශුන්‍ය හැඩතල ගැන්වේ.
mikesl

8

මෙන්න මම විධාන රේඛාවෙන් ස්වයංක්‍රීය කිරීමට ලියූ කණ්ඩායම් ගොනුවක්, නමුත් එය වින්ඩෝස් / එම්එස්-ඩොස් සඳහා.

සින්ටැක්ස් යනු rename_mysqldb දත්ත සමුදාය newdatabase -u [user] -p [මුරපදය]

:: ***************************************************************************
:: FILE: RENAME_MYSQLDB.BAT
:: ***************************************************************************
:: DESCRIPTION
:: This is a Windows /MS-DOS batch file that automates renaming a MySQL database 
:: by using MySQLDump, MySQLAdmin, and MySQL to perform the required tasks.
:: The MySQL\bin folder needs to be in your environment path or the working directory.
::
:: WARNING: The script will delete the original database, but only if it successfully
:: created the new copy. However, read the disclaimer below before using.
::
:: DISCLAIMER
:: This script is provided without any express or implied warranties whatsoever.
:: The user must assume the risk of using the script.
::
:: You are free to use, modify, and distribute this script without exception.
:: ***************************************************************************

:INITIALIZE
@ECHO OFF
IF [%2]==[] GOTO HELP
IF [%3]==[] (SET RDB_ARGS=--user=root) ELSE (SET RDB_ARGS=%3 %4 %5 %6 %7 %8 %9)
SET RDB_OLDDB=%1
SET RDB_NEWDB=%2
SET RDB_DUMPFILE=%RDB_OLDDB%_dump.sql
GOTO START

:START
SET RDB_STEP=1
ECHO Dumping "%RDB_OLDDB%"...
mysqldump %RDB_ARGS% %RDB_OLDDB% > %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=2
ECHO Creating database "%RDB_NEWDB%"...
mysqladmin %RDB_ARGS% create %RDB_NEWDB%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=3
ECHO Loading dump into "%RDB_NEWDB%"...
mysql %RDB_ARGS% %RDB_NEWDB% < %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=4
ECHO Dropping database "%RDB_OLDDB%"...
mysqladmin %RDB_ARGS% drop %RDB_OLDDB% --force
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=5
ECHO Deleting dump...
DEL %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
ECHO Renamed database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END

:ERROR_ABORT
IF %RDB_STEP% GEQ 3 mysqladmin %RDB_ARGS% drop %NEWDB% --force
IF %RDB_STEP% GEQ 1 IF EXIST %RDB_DUMPFILE% DEL %RDB_DUMPFILE%
ECHO Unable to rename database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END

:HELP
ECHO Renames a MySQL database.
ECHO Usage: %0 database new_database [OPTIONS]
ECHO Options: Any valid options shared by MySQL, MySQLAdmin and MySQLDump.
ECHO          --user=root is used if no options are specified.
GOTO END    

:END
SET RDB_OLDDB=
SET RDB_NEWDB=
SET RDB_ARGS=
SET RDB_DUMP=
SET RDB_STEP=

7

ටොඩෝඉන්ටෙක්ස් හි ගබඩා කර ඇති ක්‍රියා පටිපාටිය මට එතරම් සාර්ථක වූයේ නැත. මෙන්න මගේ පිහිය:

- ගබඩා කළ ක්‍රියා පටිපාටිය rename_db: මගේ වගු පිටපත් කිරීමේ මාධ්‍යයක් දත්ත සමුදායක් නම් කරන්න.
- ගුහා: 
- පවත්නා ඕනෑම දත්ත සමුදායක් 'නව' දත්ත සමුදා නාමයට සමාන නමක් සහිතව ක්ලෝබර් කරනු ඇත.
- වගු පමණක් පිටපත් කරයි; ගබඩා කළ ක්‍රියා පටිපාටි සහ වෙනත් දත්ත සමුදා වස්තු පිටපත් නොකෙරේ.
- ටොමර් ඇල්ට්මන් (taltman@ai.sri.com)

පරිසීමකය //
EXISTS rename_db නම් ක්‍රියා පටිපාටිය අතහරින්න;
ක්‍රියාපටිපාටිය නැවත නම් කරන්න_ඩීබී (පැරණි_ඩීබී වර්චාර් (100), නව_ඩීබී වර්චාර් (100))
ආරම්භය
    වත්මන්_ ටේබල් VARCHAR (100) ඉවත් කරන්න;
    INT DEFAULT 0 කර ඇති බව ප්‍රකාශ කරන්න;
    තොරතුරු_චෙමා.ටේබල් වලින් table_schema = old_db තෝරාගත් වගුවේ නම තෝරන්න.
    සොයා නොගැනීම සඳහා අඛණ්ඩ හැන්ඩ්ලර් ප්‍රකාශ කරන්න = 1;

    SET @output = CONCAT ('SCISEMA IF EXISTS', new_db, ';'); 
    Put ප්‍රතිදානයෙන් stmt සූදානම් කරන්න;
    ක්‍රියාත්මක කරන්න;

    SET @output = CONCAT ('නොපවතින නම් යෝජනා ක්‍රමය සාදන්න', new_db, ';');
    Put ප්‍රතිදානයෙන් stmt සූදානම් කරන්න;
    ක්‍රියාත්මක කරන්න;

    පැරණි_ ටේබල් විවෘත කරන්න;
    නැවත නැවත කරන්න
        වත්මන්_ ටේබල් තුළට පැරණි_තැබ් FETCH;
        එසේ නොකළේ නම්
        SET @output = CONCAT ('වෙනස් කිරීමේ වගුව', old_db, '.', Current_table, 'rename', new_db, '.', Current_table, ';');
        Put ප්‍රතිදානයෙන් stmt සූදානම් කරන්න;
        ක්‍රියාත්මක කරන්න;

        නම් අවසන්;
    UNTIL අවසන් END පුනරාවර්තනය;

    පැරණි_ ටේබල් වසා දමන්න;

අවසානය//
පරිසීමකය;

මෙය ක්‍රියාත්මක වන්නේ වගු සඳහා පමණක් වන අතර මෙම වගු වලට ප්‍රේරක නොමැති නම් පමණි. දර්ශන සහ ප්‍රේරක මෙයින් ගෙන යන්නේ නැත.
ඔල්ෆාන්

7

සරලම ක්‍රමය වන්නේ HeidiSQL මෘදුකාංගය භාවිතා කිරීමයි. එය නිදහස් හා විවෘත මූලාශ්‍රයකි. එය වින්ඩෝස් සහ වයින් සමඟ ඕනෑම ලිනක්ස් මත ධාවනය වේ (ලිනක්ස්, බීඑස්ඩී, සොලාරිස් සහ මැක් ඕඑස් එක්ස් මත වින්ඩෝස් යෙදුම් ධාවනය කරන්න).

HeidiSQL බාගත කිරීම සඳහා, http://www.heidisql.com/download.php .

වයින් බාගත කිරීම සඳහා, http://www.winehq.org/ .

HeidiSQL හි දත්ත සමුදායක් නැවත නම් කිරීම සඳහා, දත්ත සමුදායේ නම මත දකුණු ක්ලික් කර 'Edit' තෝරන්න. ඉන්පසු නව නමක් ඇතුළත් කර 'හරි' ඔබන්න.

එය එතරම් සරල ය.


1
එය ගබඩා කර ඇති ක්‍රියා පටිපාටි තිබේ නම් එය නැවත නම් කළ නොහැක.
abksharma

kabksharma ඇත්ත වශයෙන්ම ඔබට පණිවිඩ ලැබෙනු Database "database_name" contains stored routine(s) which cannot be moved.ඇත ප්‍රේරක (අවම වශයෙන් MariDB දත්ත සමුදාය සඳහා) ගබඩා කර ඇති ක්‍රියාකාරකම් ලෙස ගණන් ගනු ලැබේ. මා සතුව කිසිදු ගබඩා කළ ක්‍රියා පටිපාටියක් නොතිබුණි, නමුත් සියලු ප්‍රේරක ඉවත් කරන තුරු දත්ත සමුදාය නැවත නම් කිරීමට මට නොහැකි විය.
izogfif

6

MySQL Proxy භාවිතා කරමින් ඉතා විශාල දත්ත සමුදායන් ප්‍රතිෂ් oring ාපනය කිරීමේදී අක්‍රීයව සිටීමට උත්සාහ කරන සර්වර් දෝෂය පිළිබඳව මම ප්‍රශ්නයක් මතු කළෙමි . මට කිසිදු සාර්ථකත්වයක් නොතිබුණි, නමුත් අවසානයේ මට අවශ්‍ය වූයේ දත්ත සමුදායේ ක්‍රියාකාරීත්වය රෙනේම් කිරීම නිසා අපගේ දත්ත ගබඩාවේ ප්‍රමාණය නිසා ඩම්ප් / ආනයනය විකල්පයක් නොවන බැවිනි.

MySQL වෙත RENAME TABLE ක්‍රියාකාරීත්වයක් ගොඩනගා ඇති බැවින් මා වෙනුවෙන් එම කාර්යය කිරීම සඳහා සරල පයිතන් පිටපතක් ලිවීම අවසන් කළෙමි. එය අන් අයට ප්‍රයෝජනවත් විය හැකි අවස්ථාවකදී මම එය GitHub හි පළ කර ඇත්තෙමි .



3
RENAME DATABASE සින්ටැක්ස් වලින් ඉවත් කරන ලදි, RENAME TABLE නොවේ.
ඩියුක්

6

ඔබේ පහසුව සඳහා, පහත දැක්වෙන්නේ පරාමිති දෙකකින් ක්‍රියාත්මක කළ යුතු කුඩා කවච පිටපතකි: db-name සහ new db-name.

ඔබ ඔබේ නිවාස නාමාවලියෙහි .my.cnf ගොනුව භාවිතා නොකරන්නේ නම් ඔබට mysql- රේඛාවලට පිවිසුම්-පරාමිතීන් එක් කිරීමට අවශ්‍ය වනු ඇත. මෙම ස්ක්‍රිප්ට් ක්‍රියාත්මක කිරීමට පෙර කරුණාකර උපස්ථයක් සාදන්න.


#!/usr/bin/env bash

mysql -e "CREATE DATABASE $2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"
for i in $(mysql -Ns $1 -e "show tables");do
    echo "$1.$i -> $2.$i"
    mysql -e "rename TABLE $1.$i to $2.$i"
done
mysql -e "DROP DATABASE $1"

1
මෙයද, ප්‍රේරක අමුණා ඇති වගු සඳහා හෝ වෙනත් දත්ත සමුදායන් ලෙස නම් කළ නොහැකි දර්ශන සඳහා ක්‍රියා නොකරනු ඇත.
ඔල්ෆාන්

6

කිසිවෙකු මෙය සඳහන් කර නැති බව පෙනේ, නමුත් මෙහි තවත් ක්‍රමයක් තිබේ:

create database NewDatabaseName like OldDatabaseName;

ඉන්පසු එක් එක් වගුව සඳහා:

create NewDatabaseName.tablename like OldDatabaseName.tablename;
insert into NewDataBaseName.tablename select * from OldDatabaseName.tablename;

ඔබට අවශ්‍ය නම්,

drop database OldDatabaseName;

මෙම ප්‍රවේශය මඟින් සේවාදායකයේ සම්පූර්ණ හුවමාරුව ශුන්‍ය ජාල තදබදයක් සහිතව සිදු කිරීමේ වාසිය ඇත, එබැවින් එය ඩම්ප් / ප්‍රතිස්ථාපනයකට වඩා බොහෝ වේගයෙන් ගමන් කරනු ඇත.

ඔබ සතුව ක්‍රියා පටිපාටි / අදහස් / ආදිය තිබේ නම් ඒවා මාරු කිරීමටද ඔබට අවශ්‍ය විය හැකිය.


2
මා දන්නා තරමින් 5.x create databaseප්‍රකාශයේ “වැනි” මූල පදයට සහය නොදක්වයිද ? ඔබ එය ලබාගත්තේ කොහෙන්ද?
ඩ්‍රැගස්

create table likeසින්ටැක්ස් සඳහා සබැඳිය මෙන්න : dev.mysql.com/doc/refman/5.7/en/create-table-like.html . වැනි දත්ත සමුදායක් නිර්මාණය කිරීමේදී, MySQL එම වගන්තිය අතහැර දැමූ බවක් පෙනේ.
Tuncay Güncüoğlu

6

මැක් භාවිතා කරන්නන් සඳහා, ඔබට Sequel Pro(නොමිලේ) භාවිතා කළ හැකිය , එය දත්ත සමුදායන් නැවත නම් කිරීමේ විකල්පය සපයයි. එය පැරණි ඩීබී මකා නොදමනු ඇත.

අදාළ ඩීබී විවෘත කළ පසු ක්ලික් කරන්න: Database->Rename database...


එය සමහර විට පැරණි ඩීබී පණපිටින් තබන නමුත් එය හිස් ය. තවමත්, එය පිටපතක් සාදන්නේ නම්, ඔබට පිටපත සාදා පැරණි එක මකා දැමිය හැකිය, එය තවමත් සරල පියවර 2 කි.
රෝයි ගැවිරෙල්

මගේ stored proceduresසහ viewsනැවත නම් කිරීම සමඟ පිටපත් කර නැත
වේන්

4

ඔබට ගෙනයාමට බොහෝ වගු තිබේ නම්, SQL ස්ක්‍රිප්ට් නැවත නම් කිරීම සඳහා ඉක්මන් ක්‍රමයක් මෙන්න.

SELECT DISTINCT CONCAT('RENAME TABLE ', t.table_schema,'.', t.table_name, ' TO ',     
t.table_schema, "_archive", '.', t.table_name, ';' ) as Rename_SQL 
FROM information_schema.tables t
WHERE table_schema='your_db_name' ;

හොඳ පෙනුමක්, නමුත් මෙය ගබඩා කළ ක්‍රියා පටිපාටි හෝ අදහස් ගෙන යන්නේ නැත.
davidpricedev

ඔබ බොහෝ විට වගුවේ නම සහ යෝජනා
ක්‍රමයේ

4

ALTER DATABASEයනු MySQL විසින් මෙය වටා යෝජිත ක්‍රමය වන අතර RENAME DATABASEඑය අතහැර දමනු ලැබේ.

13.1.32 සිට රෙනේම් දත්ත සමුදාය සින්ටැක්ස් :

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

මෙම ප්‍රකාශය MySQL 5.1.7 හි එකතු කරන ලද නමුත් එය භයානක බව සොයා ගත් අතර එය MySQL 5.1.23 හි ඉවත් කරන ලදි.


7
ඔබට උදාහරණ සින්ටැක්ස් තිබේද? alter databaseදත්ත සමුදාය නැවත නම් කිරීම සඳහා භාවිතා කළ හැකි ක්‍රමයක් ගැන මම නොදනිමි , ඔබ සම්බන්ධ කළ ලියකියවිලි එය කළ හැකි යැයි යෝජනා නොකරයි.
ජෝර්දාන්

ජෝර්දාන් මමත් උනන්දුයි. මම උත්සාහ කර බැලුවෙමි, එය ක්‍රියාත්මක වන්නේ අනුවාදය> 5.1 සමඟ පමණක් වන නමුත් මට දැන් යාවත්කාලීන කළ නොහැක.
fancyPants

5
-1: යෝජිත ක්‍රම ගැන ලිවීම සඳහා, පසුව යෝජිත නොවන ක්‍රමයට උදාහරණයක් ලබා දෙන අතරම ආදර්ශය පෙන්වීමට පවා මුළුමනින්ම මග හැරී ඇත.
හක්රේ

3
මේක වැරදියි. MySQL නැවත නම් කිරීමේ දත්ත සමුදා ලේඛනය පවසන්නේ rename_database අදහස් කර ඇත්තේ ඉතා වෙනස් වූ නම් කිරීමේ කාර්යයක් සඳහාය (ඩීබී නැවත නම් කිරීමේ සාමාන්‍ය අවස්ථාව නොවේ), එය දැන් වෙනස් දත්ත සමුදායක් සමඟ හසුරුවනු ලැබේ: 'නව කේතීකරණය සමඟ දත්ත සමුදා නාම උත්ශ්‍රේණිගත කිරීමේ කාර්යය ඉටු කිරීම සඳහා, ALTER DATABASE db_name UPGRADE භාවිතා කරන්න. DATA DIRECTORY NAME ඒ වෙනුවට 'ඔබට අවශ්‍ය පරිදි දත්ත සමුදාය නැවත නම් කිරීම සඳහා මෙය භාවිතා කළ නොහැක, මෙම විධානය තුළ නව db නමක් සඳහා ස්ථානයක්වත් නොමැත!
කනත් බොලසාර්

3

MySQL පරිපාලක විසින් පහත සඳහන් දේ කරන්න:

  1. නාමාවලි යටතේ, නව දත්ත සමුදා ක්‍රමයක් සාදන්න.
  2. උපස්ථ වෙත ගොස් පැරණි යෝජනා ක්‍රමයේ උපස්ථයක් සාදන්න.
  3. උපස්ථ ක්‍රියාත්මක කරන්න.
  4. ප්‍රතිස්ථාපනය වෙත ගොස් 3 වන පියවරේදී සාදන ලද ගොනුව විවෘත කරන්න.
  5. ඉලක්කගත යෝජනා ක්‍රමය යටතේ 'තවත් යෝජනා ක්‍රමයක්' තෝරන්න සහ නව දත්ත සමුදා ක්‍රමය තෝරන්න.
  6. ප්‍රතිස්ථාපනය ආරම්භ කරන්න.
  7. නව යෝජනා ක්‍රම සත්‍යාපනය කරන්න, එය හොඳ යැයි පෙනේ නම්, පැරණි එක මකන්න.

MySQL පරිපාලකවරයාට විශාල දත්ත සමුදායන් හැසිරවිය නොහැකි අතර ඒ ගැන ඉක්මන් කිසිවක් නැත
deadprogrammer

3

දී phpMyAdmin ඔබට පහසුවෙන් දත්ත සමුදාය නැවත නම් කරන්න පුළුවන්

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

පැරණි වගුව අතහැර වගු දත්ත නැවත පූරණය කිරීමට ඉල්ලා සිටින්න

ඔබේ දත්ත සමුදාය නැවත නම් කරන ලදි


3

ඔබ phpMyAdmin භාවිතා කරන්නේ නම් නැවත නම් කිරීමට අවශ්‍ය දත්ත සමුදාය තෝරාගත් පසු ඔබට “මෙහෙයුම්” ටැබයට යා හැකිය. ඉන්පසු අවසාන කොටසට ගොස් "දත්ත සමුදාය පිටපත් කරන්න" (හෝ ඒ හා සමාන දෙයක්), නමක් දී පහත විකල්ප තෝරන්න. මෙම අවස්ථාවෙහිදී, ඔබ "ව්‍යුහය සහ දත්ත" තෝරාගත යුතු අතර "පිටපත් කිරීමට පෙර දත්ත සමුදාය නිර්මාණය කරන්න" පිරික්සුම් කොටු සහ අවසාන වශයෙන් එම කොටසේ "යන්න" බොත්තම ඔබන්න.

මාර්ගය වන විට, මම ස්පා Spanish ් in භාෂාවෙන් phpMyAdmin භාවිතා කරමි, එබැවින් ඉංග්‍රීසියෙන් කොටස්වල නම් මොනවාදැයි මට විශ්වාස නැත.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.