Ale*_*sov 7 mysql mysqldump backup
在执行 mysqldump 时,会跳过一些表,因为 mysqldump 将它们视为视图而不是表,尽管它们是 100% 的表。
所以对于某些表,它看起来像
-- Retrieving table structure for table services...
-- Sending SELECT query...
-- Retrieving rows...
Run Code Online (Sandbox Code Playgroud)
对于一些:
-- Retrieving view structure for table users...
-- It's base table, skipped
Run Code Online (Sandbox Code Playgroud)
我看到这个问题已经提到过几次了,但是没有解决方案。
显示创建表用户;
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`email` varchar(50) NOT NULL,
`password` varchar(50) NOT NULL,
...
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8915 DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)
SHOW TABLE STATUS LIKE 'users' \G;
*************************** 1. row ***************************
Name: users
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 6638
Avg_row_length: 713
Data_length: 4734976
Max_data_length: 0
Index_length: 2899968
Data_free: 469762048
Auto_increment: 8923
Create_time: 2015-09-04 10:00:26
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
MySQL 5.5.41-0ubuntu0.14.04.1
Mic*_*bot 11
所以对于某些表,它看起来像
好吧,所有表都应该是这样。
该消息由--verbose
选项生成,当mysqldump
它第二次通过数据库时,您应该在所有表上看到它。
因为视图不能引用不存在的对象,如果遇到视图,mysqldump 将遍历每个数据库中的所有表两次。在第一遍时,它为视图创建一个虚拟表,这样,如果一个视图引用另一个视图,虚拟表将代替目标视图,以便在恢复备份时引用视图可以有效地方。如果遇到视图,它会进行第二次传递,删除每个虚拟表并将其替换为实际视图。
它通过调用mysql_list_tables()
c-client API 来做到这一点,该 API 将“ show tables
”发送到服务器(在切换当前数据库之后)。因为它包含一个基表和视图的列表,mysqldump
必须遍历每个表和视图并决定当前标识符代表什么——一个表,在这种情况下,它什么都不做,因为该表已经被转储——或者一个视图,其中如果它删除虚拟表并创建正确的视图。(为什么它没有更智能地发现这些信息可能与向后兼容旧版本的 MySQL 服务器有关)。
简而言之,这是正常的。这些--verbose
消息只是告诉你一些你已经知道的事情。当您看到这些时,mysqldump
正在遍历数据库中所有表的列表,检查它们是否是视图(第二次)。
在第一遍期间,基表被转储并创建虚拟视图“占位符”表;在第二遍期间,基表被跳过,占位符表被删除,视图定义被转储。
该消息-- Retrieving view structure for table users...
是不好措辞,因为事实上mysqldump的是,在这一点上,检查是否表是一个视图,通过请求其CREATE
从服务器语句,邮件似乎已经给出了一个印象,原来的问题,该表是第一被错误地描述为视图,然后从转储中省略,因为它不是视图。这是一种不准确的看法,因为桌子在第一次通过时就已经被倾倒了。