我有一个关于同时使用 MyISAM 和 InnoDB 的 MySQL 数据库的逻辑备份的问题。
该mysqldump实用程序支持以下两个选项:
--single-transaction - 通过在单个事务中转储所有表来创建一致的快照。仅适用于存储在支持多版本的存储引擎中的表(目前只有 InnoDB 支持)[...] 选项自动关闭 --lock-tables。
-x, --lock-all-tables - 锁定所有数据库中的所有表。这是通过在整个转储期间获取全局读锁来实现的。自动关闭 --single-transaction 和 --lock-tables 。
对于 InnoDB,我们需要 --single-transaction
对于 MyISAM,我们需要 - 锁定表或锁定所有表(以防我们需要跨数据库一致性)。
那么,混合数据库(同时使用 MyISAM 和 InnoDB 引擎的数据库)应该如何备份?
编辑:
为了澄清,这个问题可以重新表述如下:
lock-[all-]tables 选项是否保证 InnoDB 表的一致备份?
我在 SQL 2008 中有一份工作,它运行一个存储过程来备份所有数据库。这通过 sql server 代理作业每天运行。
它每天都成功退出,但有时只有在备份了几个数据库后才成功退出。每次可以是不同数量的数据库。大多数情况下,它会成功备份所有数据库,但有时会成功备份 2 次,有时会成功备份 5 次,等等。
我在作业历史记录、事件查看器或 sql server 日志中没有看到任何错误。
备份是在本地磁盘上进行的,尽管该文件夹是可扩展存储卷上文件夹的“连接点”。
操作系统是 Windows 2003 64 位运行 Sql Server 2008 网络版 64 位作为在 Vmware ESXi 5 主机上运行的虚拟机。
存储过程:
ALTER PROCEDURE [dbo].[backup_all_databases]
@path VARCHAR(255)='c:\backups\'
AS
DECLARE @name VARCHAR(50) -- database name
DECLARE @fileName VARCHAR(256) -- filename for backup
DECLARE @fileDate VARCHAR(20) -- used for file name
DECLARE @dbIsReadOnly sql_variant -- is database read_only?
DECLARE @dbIsOffline sql_variant -- is database offline?
DECLARE db_cursor CURSOR FOR
SELECT name …Run Code Online (Sandbox Code Playgroud) 我有一个包含多个视图的模式。我需要检查执行计划以确保适当的索引到位并被使用。
我该怎么做呢?
我宁愿不必将输出复制并粘贴show create view <viewname>到 中explain,尤其是当某些视图构建在其他视图之上时,这将非常痛苦。
是否可以让SQL Server 2008 R2 Standard在任何已还原或附加到实例的给定数据库中自动执行存储过程?
我已经通过创建服务器级触发器接近解决方案,该触发器在 DDL 事件CREATE_DATABASE或被ALTER_DATABASE触发后执行给定数据库中的存储过程。不幸的是,这不适用于数据备份恢复。
详细地说,我们有一个“清理”存储过程,它存在于我们恢复的每个数据库中,我正在寻找一种方法,每当备份恢复到实例时自动执行此过程。
谷歌搜索指出我可以在 SQL Server 中配置审计或策略来获得此功能,但这些功能乍一看非常令人难以抗拒,所以我不知道审计或策略是否是开始调查的途径。
我有一个 InnoDB 数据库,我想将其迁移到 Amazon RDS。
我当前的实施托管在我自己的服务器上,每月显示大约 800 万次查询。
RDS 站点说 I/O 费率为每 100 万个请求 0.10 美元
1 个 I/O = 1 个查询吗?即,对于此使用量 + RDS 费用,我是否需要支付 80 美元/月的费用?
MySQL 没有任何 SQL 命令或内部机制
在这种情况下,如何使单个数据库脱机?
在 Debian Linux 服务器上,托管许多 PHP/MySQL 网站(图片库),有时我有“很多”文件,例如/tmp/#sql_6405_58.MYD.
例如今天:
[2012-12-15 15:18:11] /tmp/#sql_6405_6.MYD : 88MB
[2012-12-15 15:18:11] /tmp/#sql_6405_3.MYD : 22MB
[2012-12-15 15:18:11] /tmp/#sql_6405_4.MYD : 138MB
[2012-12-15 15:18:11] /tmp/#sql_6405_10.MYD : 88MB
...
[2012-12-15 15:18:11] /tmp/#sql_6405_9.MYD : 15MB
[2012-12-15 15:18:11] /tmp/#sql_6405_65.MYD : 49MB
[2012-12-15 15:18:11] /tmp/#sql_6405_44.MYD : 69MB
Run Code Online (Sandbox Code Playgroud)
(同时 59 个文件,超过 6GB...是的,我在 /tmp 中监控大文件)
不幸的是,/tmp它在同一个分区上/,它暂时中断了 Web 服务器,因为/我想是满的。然后文件消失,服务器恢复正常。
所有文件名都遵循该#sql_6405_*.MYD模式。我想了解哪个 MySQL 操作意味着这么多临时文件。我在这台服务器上有大约 2000 个数据库。是否有可能知道涉及哪个数据库?
我知道共识似乎是大约 75% 的 ram 应该专用于缓冲池。但是,我对缓冲池实例的最佳数量更感兴趣。确定设置时需要考虑哪些事项?
例如,假设我有一个 75GB 的缓冲池。我应该只分配 75 个 1GB 的缓冲池实例吗?15 个,每个 5GB?或者,每个 7.5GB 的 10 个?
我应该从单个缓冲池开始并根据我是否看到锁定来增加吗?
最大实例数应该基于什么 - 可用内核?
谢谢 - 非常感谢您的回复。
我可以运行查询SET GLOBAL binlog_format = 'ROW'并且它适用于该会话。
停止并重新启动 MySQL 后,如何使此设置保持不变?
注意:我使用的是 MySQL 5.5.19 版本(使用 Moodle),我刚刚从 MyISAM 升级到 InnoDB,因此需要这个新设置。
我曾尝试将这两个命令(单独)添加到 my.cnf 中:binlog-format=ROW和binlog_format=ROW,但都不起作用。每次更改 my.cnf 时,我都会停止并重新启动 MySQL。
我在没有设置的情况下得到的错误是邪恶的错误消息:
调试信息:无法执行语句:无法写入二进制日志,因为 BINLOG_FORMAT = STATEMENT 并且至少一个表使用仅限于基于行的日志记录的存储引擎。当事务隔离级别为 READ COMMITTED 或 READ UNCOMMITTED 时,InnoDB 仅限于行日志记录。
我有一个 MySQL 用户,我希望它只查看我想要的视图,而不是数据库中的任何其他表。我仅授予此用户对某些视图的权限,如下所示:
GRANT SHOW VIEW ON `myDatabase`.`awesome_view` TO 'thisUser'@'%'
Run Code Online (Sandbox Code Playgroud)
如果我做一个show grants;声明,我只能按预期看到这个权限。但是我希望这个用户只查询视图而不是与这些视图相关的表,但我找不到办法做到这一点。似乎是如果我希望用户对视图进行选择,则还必须为表授予选择权,还是我错了?
如果我拒绝select其余表中的语句,并且在命令行中我尝试进行选择,我会得到以下信息:
SELECT * FROM myDatabase.fordibenForYouTable;
ERROR 1142 (42000): SELECT command denied to user 'thisUser'@'localhost' for table 'fordibenForYouTable'
Run Code Online (Sandbox Code Playgroud)
这确实是我想要的,但如果我选择视图数据,我也会被拒绝。
有没有一种方法可以让用户只看到视图而不是表格?
mysql ×8
innodb ×4
myisam ×2
sql-server ×2
view ×2
amazon-rds ×1
backup ×1
binlog ×1
locking ×1
my.cnf ×1
mysql-5.1 ×1
mysql-5.5 ×1
mysqldump ×1
performance ×1
permissions ×1