linux mysql中我用mysqldump备份了全库内容,但是我只想恢复某一张表,怎么办

linux mysql中我用mysqldump备份了全库内容,但是我只想恢复某一张表,怎么办,第1张

这个问题不是MYSQL数据库方面的问题,而是如何从一个文本文件中取出需要的部分内容的问题。 从数据库角度来说,没有什么好办法,可以使用 *** 作系统中的文本编辑处理工具来实现。例如,如果不是太大,几百M可以用editplus,ultraedit等编辑工具打开找你需要sql拷贝出来导入。

如果是linux/unix,可参考如下方法:

1.使用 awk:

可以先到原数据库中使用 'show tables' 查看数据库表的列表,注意,此列表已经按照字母排序,例如:

table1

table2

table3

然后使用awk 来过滤sql语句,假设你要恢复 table2 表,可以使用下面的语句:

awk ‘/^-- Table structure for table .table2./,/^-- Table structure for table .table3./{print}’ mydumpfile.sql >/tmp/recovered_table.sql

2.使用sed:

与上面类似,假设你要恢复 table2 表,可以使用下面的语句:

cat mydumpfile.sql | sed -n -e '/Table structure for table .test1./,/Table structure for table .test2./p' >/tmp/extracted_table.sql

项目上 MySQL 还原 SQL 备份经常会碰到一个错误如下,且通常出现在导入视图、函数、存储过程、事件等对象时,其根本原因就是因为导入时所用账号并不具有SUPER 权限,所以无法创建其他账号的所属对象。ERROR 1227 (42000) : Access deniedyou need (at least one of) the SUPER privilege(s) for this operation常见场景:1. 还原 RDS 时经常出现,因为 RDS 不提供 SUPER 权限;2. 由开发库还原到项目现场,账号权限等有所不同。

处理方式:

1. 在原库中批量修改对象所有者为导入账号或修改 SQL SECURITY 为 Invoker;2. 使用 mysqldump 导出备份,然后将 SQL 文件中的对象所有者替换为导入账号。

二、问题原因我们先来看下为啥会出现这个报错,那就得说下 MySQL 中一个很特别的权限控制机制,像视图、函数、存储过程、触发器等这些数据对象会存在一个 DEFINER 和一个 SQL SECURITY 的属性,如下所示:

--视图定义CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW v_test

--函数定义CREATE DEFINER=`root`@`%` FUNCTION `f_test()` RETURNS varchar(100) SQL SECURITY DEFINER

--存储过程定义CREATE DEFINER=`root`@`%` PROCEDURE `p_test`() SQL SECURITY DEFINER

--触发器定义CREATE DEFINER=`root`@`%` trigger t_test

--事件定义CREATE DEFINER=`root`@`%` EVENT `e_test`

DEFINER:对象定义者,在创建对象时可以手动指定用户,不指定的话默认为当前连接用户;

SQL SECURITY:指明以谁的权限来执行该对象,有两个选项,一个为 DEFINER,一个为 INVOKER,默认情况下系统指定为 DEFINER;DEFINER:表示按定义者的权限来执行; INVOKER:表示按调用者的权限来执行。

如果导入账号具有 SUPER 权限,即使对象的所有者账号不存在,也可以导入成功,但是在查询对象时,如果对象的 SQL SECURITY 为 DEFINER,则会报账号不存在的报错。ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist

改写好处:1. 可以避免还原时遇到 DEFINER 报错相关问题;2. 根据输出信息知道备份是否正常进行,防止备份中遇到元数据锁无法获取然后一直卡住的情况。

Temps/usr/local/mysql/var/XXXXXX下存放着mysql所有数据文件?

那把这个目录下的所有文件直接拷贝到mysql(usr/local/mysql/var/XXXXXX,然后修改my.cnf文件

在[mysqld]元素下重新指定datadir和basedir参数,前者是mysql数据文件目录,后者是mysql安装根目录;

如果存在innodb引擎表,那么还要重新制定innodb_data_home_dir和innodb_data_file_path

前者是ibdata文件的目录,后者需要指定ibdata文件的大小,以及自增颗粒度,注意,你迁移的数据文件中本身就存在ibdata文件,所以innodb_data_file_path设置的大小必须和他一致,不然启动不了。

涉及到迁移,做好备份,以防误 *** 作导致数据丢失。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8993637.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-23
下一篇 2023-04-23

发表评论

登录后才能评论

评论列表(0条)

保存