-2

我有很多分贝。它们都包含一张表。表名未知。我需要的是,将所有表放入一个大数据库中。

因此,如果我有 3 个包含 table1、table2 和 table3 的文件,我需要一个包含 table1、table2 和 table3 的文件。表本身不能合并在一起,我只需要它们在同一个文件中。

因为我不知道我有多少带有表的文件,所以我需要使用 bash 执行此操作并解析文件列表。

非常感谢!

4

2 回答 2

0

我正在粘贴这样做的逻辑(可能必须根据您的要求进行修改)

while read line
do
count=0
 while read fine
   do
   if [ $count -gt 1 ] #as first line is tablename heading by sql
     then
     mysql -uuser -ppasword -s -e 'CREATE TABLE newdb.$fine  LIKE $line.$fine;'
     mysql -uuser -ppasword -s -e 'INSERT INTO newdb.$fine SELECT * FROM $line.$fine;;'
   done < $(mysql -uuser -ppassword -s -D$line -e 'show databases')
  fi
  count=$(($count+1));

done < $(mysql -uuser -ppassword -s -e `show databases`)   

这适用于所有数据库

如果您将所有数据库名称保存在一个文件中,您可以将该文件名作为外部 while 循环的输入

从mysql提示符一对一复制是这样的

 CREATE TABLE db2.table LIKE db1.table;
INSERT INTO db2.table SELECT * FROM db1.table;

外部 while 循环给出数据库名称,内部 while 循环给出表名。

如果您使用所需的数据库名称保存文件,那么

 while read line
do
count=0
 while read fine
   do
   if [ $count -gt 1 ] #as first line is tablename heading by sql
     then
     mysql -uuser -ppasword -s -e 'CREATE TABLE newdb.$fine  LIKE $line.$fine;'
     mysql -uuser -ppasword -s -e 'INSERT INTO newdb.$fine SELECT * FROM $line.$fine;;'
   done < $(mysql -uuser -ppassword -s -D$line -e 'show databases')
  fi
  count=$(($count+1));

done < dbnames.txt
于 2013-11-04T11:02:14.513 回答
0

您可以简单地使用数据库的转储工具。使用 sqlite3 类似:

sqlite3 mergeDB.sqlite3 < <( sqlite3 db1.sqlite3 <<< ".dump" && sqlite3 db2.sqlite3 <<< ".dump" && sqlite3 db3.sqlite3 <<< ".dump" )
于 2013-11-05T07:49:42.553 回答