使用'mysqldump'命令创建db的副本[已关闭]

b5lpy0ml  于 2023-02-03  发布在  Mysql
关注(0)|答案(1)|浏览(122)

这个问题似乎与help center中定义的范围内的编程无关。
2天前关闭。
Improve this question
有没有办法使用mysqldump命令创建一个带有示例行的数据库副本?
myslqdump -u <username> -h <host> -p <database name> [<table name> ...]
我有一个相当大的数据库,需要创建一个副本,以便开发人员可以使用该应用程序。有没有一种方法可以随机采样行并创建db的副本,而不是转储整个数据库?

6l7fqoea

6l7fqoea1#

Mysqldump确实支持行级备份,因为它有--where选项来过滤要转储的行。下面是参考手册中的说明:

***--where =“所在条件”,-w“所在条件”

仅转储由给定WHERE条件选择的行。如果条件包含空格或命令解释程序专用的其他字符,则必须在条件两边加上引号。***
但它可能不是那么用户友好。即使我们把一个子查询放在WHERE子句中,我们仍然面临着一些可能无法克服的限制。例如,让我们使用DB sakila中的actor表。在mysql cli中执行这个操作是合法的:

select * from actor 
where actor_id in (select * 
                    from (select actor_id from actor order by rand() limit 5) t 
                    );

+----------+-------------+-----------+---------------------+
| actor_id | first_name  | last_name | last_update         |
+----------+-------------+-----------+---------------------+
|       19 | BOB         | FAWCETT   | 2006-02-15 04:34:33 |
|       91 | CHRISTOPHER | BERRY     | 2006-02-15 04:34:33 |
|       11 | ZERO        | CAGE      | 2006-02-15 04:34:33 |
|      120 | PENELOPE    | MONROE    | 2006-02-15 04:34:33 |
|      109 | SYLVESTER   | DERN      | 2006-02-15 04:34:33 |
+----------+-------------+-----------+---------------------+

但是,在使用mysqldump时使用相同的WHERE子句是错误的。

mysqldump -uroot -p  sakila actor --where="actor_id in (select * from (select actor_id from actor order by rand() limit 5) t )" > /tmp/acto
r_bck.sql

-- error message:
mysqldump: Couldn't execute 'SELECT /*!40001 SQL_NO_CACHE */ * FROM `actor` WHERE actor_id in (select * from (select actor_id from actor order by rand() limit 5) t )': Table 'actor' was not locked with LOCK TABLES (1100)

此外,正如Shadow所说,在使用mysqldump时,保持引用完整性是一个问题。我们不希望表和不可用的数据集之间的关系被破坏。无论如何,请不要使用mysqldump进行随机行级采样。
在这种情况下,我能想到的最好方法是使用存储过程对新数据库执行行级备份,内容如下:

create database sakila_bck
create table sakila_bck.actor select * from sakila.actor order by rand() limit 10;
create table sakila_bck.actor_film select * from sakila.actor_film where actor_id in (select actor_id from sakila_bck.actor);
-- Note: The create table xx select * from yy does not create keys for backup table. By the way, if you want to retrieve a random number of rows, you can try the PREPARED statement to provide the `limit clause` with a randomly generated number beforehand.

整个过程绝对不是一个简单的过程,因为我们必须记住表的关系,但是一旦完成了这项工作,我们就可以安全地使用mysqldump在数据库级别转储sakila_bck。

相关问题