导入 mysql 转储到新的 Redmine 实例时未知列 'tokens.update_on'

Unknown column 'tokens.update_on' when importing mysql dump to new Redmine instance

我正在将安装的 Redmine 从 3.0.3 升级到 3.3.3。

我一直遵循的过程是在一台新机器上安装一个新的 Redmine,从当前机器导入和 sqldump,然后复制重要的东西 (files/config.yml/database.yml , plugins) 和 运行 所有必要的步骤。这在过去通常运作良好。

目前,在导入 sqldump 后,Redmine 没有启动,我收到一个我无法弄清楚的错误。

mysql 导入似乎有效:

mysql -u 'user' -p'mypassword' redmine < /home/redmine20170608.sql

然后我执行所有 运行 没有错误的常规步骤:

bundle exec rake redmine:plugins:migrate RAILS_ENV=production
bundle exec rake db:migrate RAILS_ENV=production
bundle exec rake tmp:sessions:clear
bundle exec rake tmp:cache:clear
sudo service httpd restart

当我导航到 myredmine.com 时,我收到 "Internal Error" 消息。检查日志,输出为:

ActiveRecord::StatementInvalid (Mysql2::Error: Unknown column 'tokens.updated_on' in 'field list': UPDATE `tokens` SET `tokens`.`updated_on` = '2017-06-09 07:10:56.515511' WHERE `tokens`.`user_id` = 1 AND `tokens`.`value` = '5a229e24fe73e8a43768c46af2275a8b4a60c9b3' AND `tokens`.`action` = 'session'):
  app/models/user.rb:425:in `verify_session_token'
  app/controllers/application_controller.rb:77:in `session_expired?'
  app/controllers/application_controller.rb:67:in `session_expiration'


Migrating to CreateRolesManagedRoles (20150528092912)
Started GET "/" for 72.155.92.149 at 2017-06-09 07:16:14 +0000
Processing by WelcomeController#index as HTML
Completed 500 Internal Server Error in 25ms (ActiveRecord: 1.8ms)

ActiveRecord::StatementInvalid (Mysql2::Error: Unknown column 'tokens.updated_on' in 'field list': UPDATE `tokens` SET `tokens`.`updated_on` = '2017-06-09 07:16:14.896744' WHERE `tokens`.`user_id` = 1 AND `tokens`.`value` = '5a229e24fe73e8a43768c46af2275a8b4a60c9b3' AND `tokens`.`action` = 'session'):
  app/models/user.rb:425:in `verify_session_token'
  app/controllers/application_controller.rb:77:in `session_expired?'
  app/controllers/application_controller.rb:67:in `session_expiration'

这是该文件第 425 行的代码:

scope.update_all(:updated_on => Time.now) == 1

本节内:

  # Returns true if token is a valid session token for the user whose id is user_id
  def self.verify_session_token(user_id, token)
    return false if user_id.blank? || token.blank?

    scope = Token.where(:user_id => user_id, :value => token.to_s, :action => 'session')
    if Setting.session_lifetime?
      scope = scope.where("created_on > ?", Setting.session_lifetime.to_i.minutes.ago)
    end
    if Setting.session_timeout?
      scope = scope.where("updated_on > ?", Setting.session_timeout.to_i.minutes.ago)
    end
    scope.update_all(:updated_on => Time.now) == 1
  end

我通常发现这些的错误输出是相对自我解释的,但我不知道如何解释这个。

我已经删除了所有插件以确保它不是兼容性问题并且仍然遇到同样的问题。

当前的 Redmine 是 3.0.3,运行正在 Ruby 1.9.3-p551,Rails 4.2.1 和 AWS Linux AMI 2010.03(其中建议我远离)。

新的 Redmine 是 3.3.3,运行宁 Ruby 2.2.5-p319,Rails 4.2.7.1 和 CentOS 7。

非常感谢任何帮助。

正如评论中所讨论的,错误是

ActiveRecord::StatementInvalid (Mysql2::Error: Unknown column 'tokens.updated_on'

Token 模型中没有名为 updated_on 的列,您正在尝试在 第 425 行

上更新它
scope.update_all(:updated_on => Time.now) == 1

您需要为该列添加迁移。

运行 在您的终端中从应用程序的根文件夹中执行命令,

rails g migration AddUpdatedOnToToken updated_on:datetime

rake db:migrate

答案是手动添加所需的列。第一个答案中描述的方法不起作用 - 如前所述,我一直被拒绝许可。这很奇怪,因为只有两个 mysql 用户并且都可以访问该数据库。

所以解决这个问题的方法是以 Redmine 用户身份登录 mysql 并 运行 这些命令:

USE mydatabase;
ALTER TABLE tokens ADD updated_on VARCHAR(60);

问题已解决 - 我能够继续访问 Redmine,没有任何问题。