Ruby on Rails - 获取 MySql 数据库大小

3

我想知道我的MySql数据库的当前大小,为了获取这个数据,我使用以下方法:

def self.calculate_total_db_size
    sql = "SELECT table_schema AS 'database',
                  sum( data_length + index_length ) / ( 1024 *1024 ) AS size
                  FROM information_schema.TABLES
                  WHERE ENGINE=('MyISAM' || 'InnoDB' )
                  AND table_schema = '#{get_current_db_name}'"
    return  perform_sql_query(sql)
  end



def self.get_current_db_name    
    return Rails.configuration.database_configuration[Rails.env]["database"]
end

def self.perform_sql_query(query)
     result = []
     mysql_res = ActiveRecord::Base.connection.execute(query)
     mysql_res.each_hash{ |res| result << res }
     return result
end

这在我的开发和测试环境中运行得很好,但是在生产环境中运行时查询不返回任何值。如果我手动在生产数据库上运行MySQL查询,则可以获得正确的值。为什么在生产环境中不能通过应用程序来执行查询呢?
有什么想法吗?

如果服务器运行正确的查询,请尝试在服务器上记录查询。 - Zimbabao
@Ran 感谢您的提示。如果其他人正在尝试在Rails 4中执行此操作,我必须将 mysql_res.each_hash{ ... } 更改为 mysql_res.each{ ... }(看起来 map 也可以)。 - Tyler Davis
2个回答

1

我添加了更多的日志,这帮助我找到了问题所在。我使用了以下代码:

Rails.configuration.database_configuration[Rails.env]["database"]

当我在生产环境中时,它返回一个空字符串,而在其他任何环境中都不会出现这种情况。我猜这是因为在我的database.yml文件中,在生产环境下有一个指向开发环境设置的链接(这使得生产环境的设置与开发环境相同)。

无论如何,由于我不想改变我的database.yml文件,我只是改变了获取数据库名称的方式。现在一切都很好。


0

我打赌这是生产环境下的权限问题。登录到你的生产服务器并启动数据库控制台(进入你的 Rails 目录并输入 rails db 以确保使用与你的应用相同的用户),然后尝试从 information_schema 数据库中选择表。

你在生产环境中使用的 MySQL 帐户很可能没有访问信息模式数据库中想要的记录的权限。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接