Mysql導(dǎo)表

根據(jù)業(yè)務(wù)的需求,整合數(shù)據(jù),想把 test 庫所有的表(表結(jié)構(gòu) + 表數(shù)據(jù))導(dǎo)入到主庫 dev 中,并且這些表的前綴都為 dev_。

導(dǎo)表

備份 test 庫數(shù)據(jù)

利用 mysqldump 工具,備份 test 庫的數(shù)據(jù)。

# mysqldump -uroot -p test > test_lastest.sql

修改備份文件中的表名

利用 sed 工具,在命令行修改備份文件里的表名,加上前綴 dev_,以下幾項(xiàng)都必須修改,否則導(dǎo)入表時(shí)會(huì)出錯(cuò)。( test 庫的表是沒有表前綴的。)

# sed -i 's@^DROP TABLE IF EXISTS `@DROP TABLE IF EXISTS `dev_@g' test_lastest.sql
# sed -i 's@^CREATE TABLE `@CREATE TABLE `dev_@g' test_lastest.sql
# sed -i 's@^LOCK TABLES `@LOCK TABLES `dev_@g' test_lastest.sql
# sed -i 's@^INSERT INTO `@INSERT INTO `dev_@g' test_lastest.sql
# sed -i 's@40000 ALTER TABLE `@40000 ALTER TABLE `dev_@g' test_lastest.sql

還要加上以下這行,在第6行(只要在第一條建表語句之前,無論哪一行可以)加入 USE master;,方便導(dǎo)入數(shù)據(jù)。

# sed -i 'N;6iUSE dev;' test_lastest.sql

查看給表加入前綴是否成功:

# grep 'DROP TABLE' $sql_name
# grep 'CREATE' $sql_name
# grep 'LOCK TABLES `' $sql_name

導(dǎo)入表

# mysql -uroot -p < test_lastest.sql

檢查數(shù)據(jù)。

shell腳本版

把以上的操作寫成腳本,遷移時(shí)方便些。

#!/bin/bash

sql_name="test_lastest.sql"

mysqldump -uroot -hlocalhost -pxxx test > $sql_name

sed -i 's@^DROP TABLE IF EXISTS `@DROP TABLE IF EXISTS `dev_@g' $sql_name
sed -i 's@^CREATE TABLE `@CREATE TABLE `dev_@g' $sql_name
sed -i 's@^LOCK TABLES `@LOCK TABLES `dev_@g' $sql_name
sed -i 's@^INSERT INTO `@INSERT INTO `dev_@g' $sql_name
sed -i 's@40000 ALTER TABLE `@40000 ALTER TABLE `dev_@g' $sql_name

sed -i 'N;6iUSE dev;' $sql_name

mysql -uroot -hlocalhost -pxxx < $sql_name

擴(kuò)展:MySQL批量修改表前綴

本方法通過命令的方式實(shí)現(xiàn)批量修改表前綴。
假設(shè)有數(shù)據(jù)庫 test ,原來表前綴是 test_ ,現(xiàn)在全部換成 dev_。

生成替換命令

mysql> SELECT CONCAT( 'ALTER TABLE ', table_name, ' RENAME TO dev_', substring(table_name, 6), ';') 
FROM information_schema.tables 
WHERE table_schema='test' and table_name LIKE 'test_%';
  • substring(table_name, 6) :從 test_后面字符(第6個(gè)字符)開始替換
  • table_schema :指定數(shù)據(jù)庫名

批量替換

上一步命令執(zhí)行完,會(huì)生成替換表名的sql語句,復(fù)制到編輯器中,只保留sql語句(把 | 替換成空格就行了),如:

ALTER TABLE test_thread RENAME TO dev_thread;                             
ALTER TABLE test_announcement RENAME TO dev_announcement;                     
ALTER TABLE test_article RENAME TO dev_article;
...
...

將上面結(jié)果保存為 test2dev.sql 文件,在到MySQL服務(wù)器上導(dǎo)入修改:

# mysql -uroot -p test < test2dev.sql

擴(kuò)展:改數(shù)據(jù)庫名

注意:改數(shù)據(jù)庫名是很危險(xiǎn)的操作,改名之前一定記得先備份數(shù)據(jù)庫數(shù)據(jù)。

方法1:重命名所有的表

可以利用 RENMAE 命令來修改,核心語句如下:

# 創(chuàng)建新數(shù)據(jù)庫
CREATE DATABASE new_db_name;

# 逐一修改所有的表
RENAME TABLE db_name.table1 TO new_db_name.table1
RENAME TABLE db_name.table2 TO new_db_name.table3;
...

# 刪除舊數(shù)據(jù)庫
DROP DATABASE db_name;

寫成shell腳本,則如下:

#!/bin/bash
mysqlconn="mysql -uxxx -hxxx -pxxx -S /xxx/mysql.sock"
olddb="test"
newdb="test_dev"

${mysqlconn} -e "CREATE DATABASE $newdb"

# 查出舊數(shù)據(jù)庫的所有表名
params=$(${mysqlconn} -N -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='${olddb}' ;")

# 循環(huán)修改每個(gè)表
for name in $params
do
    $mysqlconn -e "RENAME TABLE $olddb.$name to $newdb.$name"
done

${mysqlconn} -e "DROP DATABASE $olddb"

方法2:利用mysqldump導(dǎo)出數(shù)據(jù)再導(dǎo)入

# mysqldump -uxxxx -pxxxx -h xxxx db_name > db_name_dump.sql
# mysql -uxxxx -pxxxx -h xxxx -e “CREATE DATABASE new_db_name”
# mysql -uxxxx -pxxxx -h xxxx new_db_name < db_name_dump.sql
# mysql -uxxxx -pxxxx -h xxxx -e “DROP DATABASE db_name”
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容