小编Rol*_*DBA的帖子

使用 MyISAM 和 InnoDB 引擎的数据库的一致逻辑备份

我有一个关于同时使用 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 表的一致备份?

mysql innodb myisam mysqldump

9
推荐指数
1
解决办法
9372
查看次数

尽管总是说作业成功,但计划备份任务并不总是备份所有数据库

我在 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)

sql-server-2008 sql-server backup

9
推荐指数
2
解决办法
1165
查看次数

加载从 mysqldump 创建的数据时如何显示警告?

我有一个很大的 .sql 文件,里面有很大的 insert into ... values ... 语句。其中许多语句在执行期间会生成警告。如何让 mysql 打印警告?

如果它击中 control-C,则导入停止,我将返回 OS 命令行。

以下是运行 SQL 的示例输出:

Query OK, 9827 rows affected, 5403 warnings (0.20 sec)
Records: 9827  Duplicates: 0  Warnings: 5403

Query OK, 9859 rows affected, 5247 warnings (0.20 sec)
Records: 9859  Duplicates: 0  Warnings: 5247
Run Code Online (Sandbox Code Playgroud)

mysql mysqldump backup

9
推荐指数
1
解决办法
2万
查看次数

如何获取视图的执行计划?

我有一个包含多个视图的模式。我需要检查执行计划以确保适当的索引到位并被使用。

我该怎么做呢?

我宁愿不必将输出复制并粘贴show create view <viewname>到 中explain,尤其是当某些视图构建在其他视图之上时,这将非常痛苦。

mysql performance execution-plan view

9
推荐指数
2
解决办法
1万
查看次数

用一条语句更新表中的多行?

更新表中多行的最简单方法是什么?我有一个如下所示的 csv 文件:

|primary_key |value|
|          1 |  xyz|
|          2 |  abc|
|          3 |  def|
...
Run Code Online (Sandbox Code Playgroud)

目标表中已存在具有这些主键的行

我想用这些值更新目标表。是否有语法,以便我可以编写如下内容:

update mytable set value = ('xyz', 'abc', 'def') where primary key = (1,2,3);
Run Code Online (Sandbox Code Playgroud)

查看MySQL 更新参考、本站点(MySQL-csv 更新)、SO(更新多行多个数据库更新更新多行),我怀疑答案是“否”,但我想确认这一点是真的。

mysql update replace

9
推荐指数
1
解决办法
3万
查看次数

如何在一张表中有两个自动增量列?

我有一个 MySQL 表,其中包含有关公司发票的信息。但是,这家公司有两个分公司,每个分公司都有独特的开票顺序;可以说是“意甲”和“意甲”。但是,这是一家公司,我不想创建两个发票表。相反,我想为一张表设置两个不同的自动增量。我知道这在技术上是不可能的,但我想这是其他人以前解决过的一个问题,所以我想知道这个问题是否有一个众所周知的“解决方案”?

我现在正在做的不是使用主键作为发票编号(这将是理想的),而是使用带有发票 ID 的辅助列,该列是手动递增的(嗯,使用 PHP 脚本,但它仍然不是自动的),通过检查该特定系列的最新发票。

这是我目前的设置:

CREATE TABLE `invoices` (
  `id` mediumint unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `invoicenumber` mediumint unsigned NOT NULL,
  `branch` enum('A','B') NOT NULL,
  `date` date NOT NULL,
  `client` varchar(100) NOT NULL
) COMMENT='' ENGINE='InnoDB';
Run Code Online (Sandbox Code Playgroud)

要检查延迟发票,我运行:

SELECT MAX(invoicenumber+1) AS new_invoice_number FROM invoices WHERE branch = 'A'

mysql database-design

9
推荐指数
1
解决办法
2万
查看次数

为什么 MySQL 会产生这么多的临时 MYD 文件?

在 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 个数据库。是否有可能知道涉及哪个数据库?

mysql myisam temporary-tables

9
推荐指数
2
解决办法
3万
查看次数

MySQL 二进制日志 - 跳过一个表

有没有办法跳过二进制日志中的特定表?

我已将二进制日志配置为每晚备份之间的增量备份策略。但是我们有一个巨大的参考表,我们将每晚从批处理(70GB 表)中更新。此表仅供读取,并且每晚使用mysqlimport.

在这个仅供参考的表的更新过程中,二进制日志导致了相当严重的延迟(尤其是当我进行完整的 70GB 更新时)。基本上它必须做两次 70GB。糟糕。

参考表当前正在使用 MyISAM(我阻止 InnoDB 尝试加载它,因此尝试使用 MyISAM)。

mysql logs binlog

9
推荐指数
1
解决办法
1万
查看次数

OPTIMIZE TABLE 对我的数据有什么影响吗?

我的数据库速度变慢了。phpMyAdmin 中的分析器建议我OPTIMIZE TABLE在我的表上运行。

但在这样做之前,我(当然)想知道表中的数据是否会发生任何事情,或者此操作是否完全无害。

使用时我应该考虑利弊OPTIMIZE TABLE吗?索引和主键会保持不变吗?数据库中是否有优化后会变慢的区域?

mysql innodb myisam optimization

9
推荐指数
1
解决办法
2万
查看次数

验证 mysqldump 备份没有损坏

我们有一个 cron 任务使用来备份我们的数据库mysqldump- 我主要担心的是损坏,没有每次手动导入和检查备份,检查/验证备份是否无损坏的最佳方法是什么?

背景:我们正在运行 mysql 5.5.* 和 InnoDB。我们mysqldump直接从服务器运行。我们目前没有使用主/从或主/主,但如果有帮助,可以更改。DB 目前小于 1mb,在可预见的未来将小于 50mb,因此在这种情况下确实不需要考虑规模。

mysql innodb mysqldump backup restore

9
推荐指数
2
解决办法
2万
查看次数