根據(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”