我有很多分贝。它们都包含一张表。表名未知。我需要的是,将所有表放入一个大数据库中。
因此,如果我有 3 个包含 table1、table2 和 table3 的文件,我需要一个包含 table1、table2 和 table3 的文件。表本身不能合并在一起,我只需要它们在同一个文件中。
因为我不知道我有多少带有表的文件,所以我需要使用 bash 执行此操作并解析文件列表。
非常感谢!
我正在粘贴这样做的逻辑(可能必须根据您的要求进行修改)
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
您可以简单地使用数据库的转储工具。使用 sqlite3 类似:
sqlite3 mergeDB.sqlite3 < <( sqlite3 db1.sqlite3 <<< ".dump" && sqlite3 db2.sqlite3 <<< ".dump" && sqlite3 db3.sqlite3 <<< ".dump" )