【问题标题】:.mysql_history not being saved automatically.mysql_history 没有被自动保存
【发布时间】:2016-05-17 15:19:54
【问题描述】:

我无法让 mysql 命令行历史记录为我的用户工作,即使它对同一台机器上的其他用户工作正常(Debian“wheezy”发行版上的 mysql 5.5。)我无计可施,并希望这里有人可以帮助我...

每当我启动 mysql 时,我都没有历史可回滚(例如,当我尝试向上箭头时,它只会给出一个可视的铃铛警报)。

但是,当我使用它时,历史记录运行良好(在单个会话中)。即,自从我启动 mysql 以来,我可以回到之前的命令。但是,第二次我退出 mysql,我失去了我所有的历史,下一次必须重新开始。

不用说,这非常令人沮丧!

为了排除故障,我做了三件事,但都没有任何区别:

(1)我明确设置了环境变量(使用bash):

% MYSQL_HISTFILE=~/.mysql_history
% echo $MYSQL_HISTFILE
/var/home/userx/.mysql_history

...我仔细检查了权限是否设置正确(在文件和目录上——注意,我创建了一个空文件只是为了确保它本身没有问题):

drwxr-xr-x  53 userx userx 4096 Jan 24 15:26 /var/home/userx
-rw-------   1 userx userx    0 Jan 31 04:14 /var/home/userx/.mysql_history

我确认它是“-rw-------”并且该文件由相关用户(我)拥有,与同一台机器上的所有其他用户相同,它可以正常工作。不过,mysql 客户端文档并没有说您需要设置此环境变量,除非您想更改它(所以我当然也尝试过没有设置该变量)。

(2) 我尝试在 /etc/mysql/my.cnf 中设置/调整各种与日志记录相关的配置(通过查看文档;但是,所有设置似乎都是关于日志记录,而不是命令行历史记录)。

/etc/mysql/*.cnf 中的所有设置似乎都与命令行日志记录无关(仅与服务器级别的日志记录有关,例如到/var/log/mysql...)。

可以肯定的是,我将所有内容都恢复到标准安装中的状态(通过 debian wheezy apt-get install mysql),所以我的任何胡闹都不是真正的原因。 (注意:它适用于同一台机器上的其他用户!)

(3) 我尝试检查/调整 mysql 本身中的各种变量(基于我看到的各种内容)。但是这些很难找到好的信息,而且由于它适用于同一台机器上的其他用户,我怀疑这是否重要。无论如何,这就是我在这里所做的:

首先,为了获得所有当前设置变量的列表,我做了:

% echo "show variables" | mysql > /tmp/vars

浏览它们,我没有看到任何似乎相关的东西。但这里有一些例子(在这里转储所有这些太长了;让我知道是否有一个变量或一个我可以做的搜索可能会产生答案):

% grep -i hist /tmp/vars
performance_schema_events_waits_history_long_size       10000
performance_schema_events_waits_history_size    10
profiling_history_size  15

...以及...

% grep -i log /tmp/vars    (note: irrelevant binlog stuff excerpted)
back_log        50
expire_logs_days        10
general_log     OFF
general_log_file        /var/lib/mysql/xxx.log
innodb_log_group_home_dir       ./
innodb_mirrored_log_groups      1
log     OFF
log_error
log_output      FILE
log_queries_not_using_indexes   OFF
log_slave_updates       OFF
log_slow_queries        OFF
log_warnings    1
slow_query_log  OFF
slow_query_log_file     /var/lib/mysql/rimu3-slow.log

这些似乎都不相关,我根据与更改变量相关的各种网络搜索所做的任何事情都没有解决我的问题——而且,请记住:同一台机器上的其他用户都没有这个问题。因此,除非我没有找到的变量或其他服务器状态实际上专门指的是我的用户,或者在某处我没有发现专门指我的用户的访问策略(例如),否则这是无法解释的。

我可以在任何地方找到关于 mysql_history 文件的唯一文档是 here。但它并没有告诉你如何启用 mysql_history! (它只说明了如何禁用它,或者改变它的去向,这对我来说也没有任何改变。)

最后,我已经确认,最后,我的故障排除并没有导致任何设置不正确:我回到了标准环境变量、服务器配置、变量等。

我真的完全被难住了。任何帮助将不胜感激!

史蒂夫

【问题讨论】:

  • 好吧,我至少在寻找解决方案的正确轨道上......我认为这与使用 mysql 正在使用的 readline 库(或设置这来自那个。)但是,要清楚,我查看了 /etc/inputrc 和 ~/.inputrc ,没有任何东西可以设置历史文件的大小。 然而,当我使用rlwrap 包装mysql 命令行时,我的问题就消失了!没错——当我通过rlwrap 运行mysql 时,~/.mysql_history 突然开始更新,例如:% rlwrap -a -A mysql。 (它只适用于-a-A。)

标签: mysql linux debian


【解决方案1】:

我发现了问题。

实际上有两个文件用于mysql历史记录:~/.mysql_history~/.mysql_history.TMP。我只用ptrace发现了第二个文件:

open("/var/home/userx/.mysql_history.TMP", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0600) = -1 EACCES (Permission denied)

知道有两个文件,问题就清楚多了:

% ls ~/.mysql_history*
-rw-------   1 userx userx      0 Jan 31 04:14 /var/home/userx/.mysql_history
-rw-------   1 root  root  279506 May 11  2014 /var/home/userx/.mysql_history.TMP

(是的,这个问题可以追溯到 2014 年 5 月,所以现在一切都变得很有意义了。)

就我而言,我通过 sudo 获得了 root 访问权限,因此我可以轻松修复它:

% sudo chown userx:userx /home/userx/.mysql_history.TMP

随后对 mysql 的使用效果很好(尽管我在这之间的所有历史仍然永远丢失了)。 :-(

根本问题是: (a) mysql 文档没有提到这个文件(事实上,不应该真的需要它),并且 (b) mysql 客户端不会向最终用户提供任何错误消息,让他们知道此文件在启动或退出时是不可修改的。

--

简而言之,就是这样:

(1) mysql 文档没有提及它使用需要相同权限的.mysql_history.TMP 的任何地方。

(2) 使用像 rlwrap 这样的包装器可以解决这个问题(请参阅我上面的评论),因为它显然不使用该文件的 .TMP 版本。

史蒂夫

【讨论】:

    猜你喜欢
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    相关资源
    最近更新 更多