Mysql導表

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

導表

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

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

# mysqldump -uroot -p test > test_lastest.sql

修改備份文件中的表名

利用 sed 工具,在命令行修改備份文件里的表名,加上前綴 dev_,以下幾項都必須修改,否則導入表時會出錯。( 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;,方便導入數(shù)據(jù)。

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

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

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

導入表

# mysql -uroot -p < test_lastest.sql

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

shell腳本版

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

#!/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

擴展:MySQL批量修改表前綴

本方法通過命令的方式實現(xiàn)批量修改表前綴。
假設有數(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個字符)開始替換
  • table_schema :指定數(shù)據(jù)庫名

批量替換

上一步命令執(zhí)行完,會生成替換表名的sql語句,復制到編輯器中,只保留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;
...
...

將上面結果保存為 test2dev.sql 文件,在到MySQL服務器上導入修改:

# mysql -uroot -p test < test2dev.sql

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

注意:改數(shù)據(jù)庫名是很危險的操作,改名之前一定記得先備份數(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)修改每個表
for name in $params
do
    $mysqlconn -e "RENAME TABLE $olddb.$name to $newdb.$name"
done

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

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

# 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”
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容