根據(jù)業(yè)務(wù)的需求,整合數(shù)據(jù),想把 test
庫(kù)所有的表(表結(jié)構(gòu) + 表數(shù)據(jù))導(dǎo)入到主庫(kù) dev
中,并且這些表的前綴都為 dev_
。
導(dǎo)表
備份 test 庫(kù)數(shù)據(jù)
利用 mysqldump
工具,備份 test
庫(kù)的數(shù)據(jù)。
# mysqldump -uroot -p test > test_lastest.sql
修改備份文件中的表名
利用 sed
工具,在命令行修改備份文件里的表名,加上前綴 dev_
,以下幾項(xiàng)都必須修改,否則導(dǎo)入表時(shí)會(huì)出錯(cuò)。( test
庫(kù)的表是沒(méi)有表前綴的。)
# 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行(只要在第一條建表語(yǔ)句之前,無(wú)論哪一行可以)加入 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批量修改表前綴
本方法通過(guò)命令的方式實(shí)現(xiàn)批量修改表前綴。
假設(shè)有數(shù)據(jù)庫(kù) test
,原來(lái)表前綴是 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è)字符)開(kāi)始替換 -
table_schema
:指定數(shù)據(jù)庫(kù)名
批量替換
上一步命令執(zhí)行完,會(huì)生成替換表名的sql語(yǔ)句,復(fù)制到編輯器中,只保留sql語(yǔ)句(把 |
替換成空格就行了),如:
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ù)庫(kù)名
注意:改數(shù)據(jù)庫(kù)名是很危險(xiǎn)的操作,改名之前一定記得先備份數(shù)據(jù)庫(kù)數(shù)據(jù)。
方法1:重命名所有的表
可以利用 RENMAE
命令來(lái)修改,核心語(yǔ)句如下:
# 創(chuàng)建新數(shù)據(jù)庫(kù)
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ù)庫(kù)
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ù)庫(kù)的所有表名
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”