我可以看看MySQL中是否使用了一个视图

时间:2016-05-10 08:52:37

标签: mysql view

我想将大型数据库中的某些表迁移到另一个结构中。为了向后兼容,我想通过视图公开旧结构。现在我想看看是否正在使用这个视图,所以如果它不再使用我可以删除它。由于数据库大小和体系结构查询日志无法放入。

有没有办法做到这一点?即将记录插入到该视图上的select上的accesslog表中,或任何其他方式。

2 个答案:

答案 0 :(得分:1)

免费版本的mysql仅提供用于记录发送到服务器的任何语句的通用查询日志。调用视图不会导致任何可捕获的事件,因此您无法填充自己的查询日志。我看到你可以遵循3个选项:

  1. 使用存储过程返回数据而不是视图。在存储过程中,您可以执行日志记录,也可以返回结果集。显然,您无法轻松加入或过滤结果集。

  2. 获取mysql的entrerprise版本并安装the audit log plugin以获得更好的性能友好日志记录选项。通过这种方式,您可以查看是否仍在使用您的观看次数。

  3. 说实话,我不一定会跟踪这些观点的使用,特别是如果你打算最终将它们关闭的话。为用户提供时间表,直到视图可用时,在截止日期越来越近的时候提醒他们,并在指定的截止日期前禁用视图。如果任何用户根据视图拥有完善的解决方案,他们将不愿意更改它,除非你强迫他们这样做。

答案 1 :(得分:1)

您可以在视图中使用函数作为列来在表中写入日志条目。

create table LogView (
   Viewname varchar(50) not null, 
   Username varchar(50) not null, 
   dt datetime, 
   primary key (Viewname, Username)
);

delimiter $$

create function fctViewLog(Viewname varchar(50)) returns int deterministic
begin
  insert into LogView (Viewname, username, dt) 
  values (Viewname, Current_User(), now()) 
  on duplicate key update dt = now();
  return 0;
end $$

Delimiter ;

create view ViewOldTable as (
select ..., fctViewLog('ViewOldTable') as JustForLogging from YourNewTable);

这将在视图中添加一列值为0.如果该新列是一个问题,您可以使用视图中的现有列并返回其值。如果您的视图具有任何整数值,例如id,你可以使用:

create function fctViewLog(Viewname varchar(50), in_value int) returns int deterministic
begin
  insert into LogView (Viewname, username, dt) 
  values (Viewname, Current_User(), now()) 
  on duplicate key update dt = now();
  return in_value;
end $$

Delimiter ;

create view ViewOldTable as (
select ..., fctViewLog('ViewOldTable', id) as id 
from YourNewTable);

然后列的数量和名称将保持不变。

它会为你的视图增加一个可测量的开销,因为它将为视图中的每一行更新LogTable,但这只会在使用旧结构而不是新结构时发生,我猜,这是主要关注;并且它可能具有促使用户更新客户端的副作用。您可以通过例如优化它来进行优化当条目存在时不更新dt-row(例如,如果时间无关紧要),但它仍然会减慢它。