“就好了一个选项,允许抑制中的定义者语句创建视图,mysqldump生成的语句。这将有助于在数据库之间传输的数据结构不同的安全模型”。
TLDR;
使用mysqlpump与选择- - -跳过- - - - - -定义者而不是,mysqldump。
这个故事
这是要求MySQL错误# 246802006年11月29日。这个特性请求得到大型社区的支持。即使我们不能看到的人投票支持这个请求,评论的数量是令人印象深刻。
请求很合理:,mysqldump被广泛使用在应用程序开发过程中,它是一种很常见的实践开发人员的机器之间迁移数据库结构和生产服务器。
想象这样一个情况,开发商Sveta创建一个数据库,并增加了几个对象定义者条款。我们将只使用一个这篇文章,但在现实中,她可以有很多。
|
1
2
|
mysql>
创建
视图
large_tables
作为
选择
*
从
information_schema。表
在哪里
DATA_LENGTH
>
100000000;
查询好吧,0
行
影响(0,1sec)
|
一旦你创建一个视图的默认定义者的用户创建这个视图:
|
1
2
3
4
5
6
7
|
mysql>
选择
定义者,TABLE_SCHEMA,TABLE_NAME
从
information_schema.views
在哪里
TABLE_NAME =“large_tables”;
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - +
|
定义者
|TABLE_SCHEMA|TABLE_NAME
|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - +
|
(电子邮件保护)%|实在
|large_tables|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - +
1
行
在
集
(0,1sec)
|
这导致问题当另一个用户试图将这种观点导入不同的服务器:
|
1
2
3
4
5
6
7
8
9
10
11
|
这是61年线的内容:
|
1
2
3
4
5
6
7
8
9
10
|
美元,mysqldump-usveta实在|头- n62年|尾巴
/ * !50001DROP VIEW IF EXISTS `large_tables`*/;
/ * !50001SET @saved_cs_client = @@character_set_client */;
/ * !50001SET @saved_cs_results = @@character_set_results */;
/ * !50001SET @saved_col_connection = @@collation_connection */;
/ * !50001SET character_set_client = utf8mb4 */;
/ * !50001SET character_set_results = utf8mb4 */;
/ * !50001SET collation_connection = utf8mb4_0900_ai_ci */;
/ * !50001创建算法=未定义的*/
/ * !50013定义者=”sveta`@`%` SQL SECURITY DEFINER */
|
这是一个创建视图在导入操作失败。
不幸的是,,mysqldump还没有一个选项,允许迁移实在。
但自2015年8月和MySQL 5.7.8我们有一个解决方案,不幸的是,被忽视了,取而代之的是著名的工具,mysqldump。
版本5.7.8之后创建它,有一个新的转储工具:mysqlpump的选项- - -跳过- - - - - -定义者并允许迁移数据库对象没有任何问题:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
美元
mysqlpump
- - - - - -
h127
。
0.0.1
- - - - - -
P3306
- - - - - -
usveta
- - -
跳过
- - - - - -
定义者
实在
|
mysql
- - - - - -
h127
。
0.0.1
- - - - - -
P13000
- - - - - -
uproduction
实在
转储
完成
在
17
美元
mysql
- - - - - -
h127
。
0.0.1
- - - - - -
P13000
- - - - - -
uproduction
实在
- - - - - -
e
“显示表”
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
+
|
Tables_in_definers
|
Table_type
|
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
+
|
大
_表
|
视图
|
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
+
美元
mysql
- - - - - -
h127
。
0.0.1
- - - - - -
P13000
- - - - - -
uproduction
实在
- - - - - -
e
“选择定义者、TABLE_SCHEMA TABLE_NAME information_schema。观点,TABLE_NAME =“large_tables”;"
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
|
定义者
|
TABLE_SCHEMA
|
表
_的名字
|
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
|
生产
@
%
|
实在
|
large_tables
|
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
|
请注意,mysqlpump自动添加创建数据库到转储和完整路径数据库对象。如。创建算法=未定义的视图”实在”。”large_tables”作为选择…因此该方法不能用于迁移的观点,程序,或触发器定义不同数据库在同一台服务器上。
更多信息mysqlpump为什么你应该切换到这个工具,mysqldump读这篇文章,mysqlpump实用程序。
雷竞技下载官网MySQL Percona分布是最完整的,稳定的,可伸缩的,和安全,开源MySQL解决方案,提供企业级的数据库环境最关键业务应用程序…和它的免费使用!






从用户迁移到用户B呢?
什么是这样的警告:更新mysql。proc设置延迟= '用户B ',推迟=“用户”;
吗?
好吧,你不应该直接更新权限表。但无论如何,这不会帮助你如果你想从服务器在用户迁移到服务器B有用户B和没有用户:转储文件不会仅仅是进口的。
嗨Sveta,
谢谢你的博客,mysqldump关于这个问题。我回答与另一篇文章使用相同的例子但是mysqlpump MySQL外壳,必须首选。看到的:https://blogs.oracle.com/mysql/migrate——所有权——-你-存储- routines%2c视图和触发器- - mysql在- 2021
欢呼,
它可以创建好单独的SQL文件,其中包含所有数据库、表、例程和其他对象?
不为单一文件不是兼容并行加载…不过您可以创建一个单一的zip文件(或焦油,谢谢,…)包含所有
MySQL壳绝对是更好,但有一件事我努力实现是如何转储所有例程的DDL,扣除我的表的DDL…excludeTables应该能够接受通配符或至少可以选择“所有”
缺乏mysqlpump skip-lock-tables选项容易和PXC在严格模式下,出于某种原因,即使不包括表我越来越改变表的索引,使用模式…