当数据库位于不同用户下时,将数据从一个数据库中的表复制到另一个数据库中的表的最佳方法是什么?
我知道我可以用
INSERT INTO database2.table2 SELECT * from database1.table1
但是这里的问题是database1
和database2
都属于不同的MySQL用户。因此user1
只能访问database1
并且user2
只能访问database2
。任何想法?
当数据库位于不同用户下时,将数据从一个数据库中的表复制到另一个数据库中的表的最佳方法是什么?
我知道我可以用
INSERT INTO database2.table2 SELECT * from database1.table1
但是这里的问题是database1
和database2
都属于不同的MySQL用户。因此user1
只能访问database1
并且user2
只能访问database2
。任何想法?
Answers:
如果您具有外壳程序访问权限,则可以使用mysqldump
转储的内容database1.table1
并将其通过管道传输mysql
到database2
。这里的问题table1
仍然是table1
。
mysqldump --user=user1 --password=password1 database1 table1 \
| mysql --user=user2 --password=password2 database2
也许您需要使用另一个查询将其重命名table1
为table2
。另一种方法是,您可以使用sed在to管道之间将table1更改为table2。
mysqldump --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2
如果table2已经存在,则可以将参数添加到第一个mysqldump中,该参数不允许创建table-creates。
mysqldump --no-create-info --no-create-db --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2
CREATE TABLE db1.table1 SELECT * FROM db2.table1
其中db1是目标,而db2是源
ALTER TABLE db1.table1 ADD PRIMARY KEY (id); ALTER TABLE db1.table1 MODIFY COLUMN id INT AUTO_INCREMENT;
如果您使用的是PHPMyAdmin,则可能非常简单。假设您具有以下数据库:
DB1 & DB2
DB1有您要复制到DB2的表用户
在PHPMyAdmin下,打开DB1,然后转到users表。
在此页面上,单击右上方的“操作”标签。在“操作”下,查找“ 将表复制到(database.table)”部分:
&你完成了!
这将轻松解决迁移问题。您可以在MySql和SqlServer之间迁移选定数据库的选定表。您绝对应该尝试一下。
mysql Workbench
迁移与SQLYog
的数据库副本进行了比较吗?从我的快速浏览看来,它们似乎非常相似,但是mysql workbench是一个较新的功能
我知道这是一个古老的问题,只需回答即可,以便在此着陆的人获得更好的方法。
从5.6.10开始,您可以
CREATE TABLE new_tbl LIKE orig_tbl;
在这里参考文档:https : //dev.mysql.com/doc/refman/5.7/en/create-table-like.html
使用MySql Workbench的导出和导入功能。步骤:
1.选择所需的值
E.g. select * from table1;
使用与第一个相似的列创建一个新表
E.g. create table table2 like table1;
从新表中全选
E.g. select * from table2;
单击导入,然后选择在步骤2中导出的CSV文件
尝试mysqldbcopy
(文档)
或者,您可以在目标主机上创建一个“ 联合表 ”。联合表使您可以从其他数据库服务器查看表,就好像它是本地表一样。(文件)
创建联合表之后,可以使用通常的方式复制数据。 insert into TARGET select * from SOURCE
获取所需查询的一种简单方法是使用information_schema和concat中的数据。
SELECT concat('CREATE TABLE new_db.', TABLE_NAME, ' LIKE old_db.', TABLE_NAME, ';') FROM `TABLES` WHERE TABLE_SCHEMA = 'old_db';
然后,您将获得如下结果列表:
CREATE TABLE new_db.articles LIKE old_db.articles;
CREATE TABLE new_db.categories LIKE old_db.categories;
CREATE TABLE new_db.users LIKE old_db.users;
...
然后,您可以只运行那些查询。
但是,它不适用于MySQL Views。您可以通过AND TABLE_TYPE = 'BASE TABLE'
在初始查询中追加来避免它们:
这是您需要定期执行的事情,还是只需要一次性完成?
您可以进行导出(例如,使用phpMyAdmin或类似方法),将表及其内容脚本化为文本文件,然后可以将其重新导入到另一个数据库中。
首先创建转储。添加了--no-create-info --no-create-db
标志(如果table2
已经存在):
mysqldump -u user1 -p database1 table1 > dump.sql
然后输入user1
密码。然后:
sed -e 's/`table1`/`table2`/' dump.sql
mysql -u user2 -p database2 < dump.sql
然后输入user2
密码。
与@helmors答案相同,但这种方法更安全,因为密码不会以原始文本形式显示在控制台中(反向i搜索,密码嗅探器等)。如果从脚本文件中执行了适当的权限限制,则可以采用其他方法。
IN xampp只是将所需的表导出为.sql文件,然后将其导入到所需的表中
像sakila.customer(Database_name.tablename)一样创建表destination_customer,这只会复制源表的结构,对于数据也要与该结构复制的操作,请从sakila.customer中选择select *创建表destination_customer
CREATE TABLE LIKE
问题没有了,那为什么要说错呢?而且,没有关于该答案如何解决两个用户都无法访问另一个表的问题的解释。