本文将介绍为相当大的数据库进行MySQL备份的最佳方法(MyISAM/InnoDB)的详细情况,特别是关于在当前数据库中对表employee做一个备份的相关信息。我们将通过案例分析、数据研究等多种方式
本文将介绍为相当大的数据库进行MySQL备份的最佳方法(MyISAM / InnoDB)的详细情况,特别是关于在当前数据库中对表employee做一个备份的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Mysql InnoDB 和 MyISAM 的区别、Mysql InnoDB与MyISAM、mysql myisam innodb 区别、MySQL MyISAM 转 Innodb的知识。
本文目录一览:- 为相当大的数据库进行MySQL备份的最佳方法(MyISAM / InnoDB)(在当前数据库中对表employee做一个备份)
- Mysql InnoDB 和 MyISAM 的区别
- Mysql InnoDB与MyISAM
- mysql myisam innodb 区别
- MySQL MyISAM 转 Innodb
为相当大的数据库进行MySQL备份的最佳方法(MyISAM / InnoDB)(在当前数据库中对表employee做一个备份)
不幸的是,由于流量很大,我们最近遇到了障碍,因此我设置了另一个主服务器以帮助缓解读取/备份.
现在,我只是使用MysqLdump和一些参数,它被证明是好的..直到现在.显然MysqLdump是一种缓慢的快速方法,但我相信我们已经超出了它的用途.我现在需要一个很好的选择,并一直在寻找利用Maatkits mk-parallel-dump实用程序或LVM快照解决方案.
简洁的短版本:
>我需要备份一个相当大的MysqL数据库
>使用MysqLdump的当前方法效率低且速度慢(导致问题)
>研究诸如mk-parallel-dump或LVM快照之类的东西
任何建议或想法都会受到赞赏 – 因为我必须重新做我们正在做的事情,我宁愿让它做得恰到好/最有效率:).
解决方法
InnoDB hot backup是一款出色的商业产品,但我不确定它如何处理同一数据库中的混合表. pQd对XtraBackup的建议可能比较好.
其他像LVM快照,我会说这绝对值得考虑.最终,解决方案的组合可能是最好的.
值得注意的是,这是一个古老的话题.在High Performance MySQL书籍,MySQL manual和之前的ServerFault问题之间 – 这已经在一般情况下用尽了.看到:
> Is there any equivalent of mysqlhotcopy for InnoDB?
> Backup MySQL Server
> How do you usually back up your database?
Mysql InnoDB 和 MyISAM 的区别
InnoDB 和 MyISAM 是许多人在使用 MySQL 时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。
基本的差别为:MyISAM 类型不支持事务处理等高级处理,而 InnoDB 类型支持。MyISAM 类型的表强调的是性能,其执行数度比 InnoDB 类型更快,但是不提供事务支持,而 InnoDB 提供事务支持已经外部键等高级数据库功能。
以下是一些细节和具体实现的差别:
1.InnoDB 不支持 FULLTEXT 类型的索引。
2.InnoDB 中不保存表的具体行数,也就是说,执行 select count (*) from table 时,InnoDB 要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。注意的是,当 count (*) 语句包含 where 条件时,两种表的操作是一 3. 对于 AUTO_INCREMENT 类型的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中,可以和其他字段一起建立联合索引。
4.DELETE FROM table 时,InnoDB 不会重新建立表,而是一行一行的删除。
5.LOAD TABLE FROM MASTER 操作对 InnoDB 是不起作用的,解决方法是首先把 InnoDB 表改成 MyISAM 表,导入数据后再改成 InnoDB 表,但是对于使用的额外的 InnoDB 特性(例如外键)的表不适用。
另外,InnoDB 表的行锁也不是绝对的,假如在执行一个 SQL 语句时 MySQL 不能确定要扫描的范围,InnoDB 表同样会锁全表,例如 update table set num=1 where name like “% aaa%”
在实际应用中,MyISAM 不一定比 InnoDB 快,原因如下:
MyISAM 采用的是表级锁和读乐观锁,也即是在有读操作时,所有对同个表的操作将被阻塞等待读操作完成,反则亦然,多个写操作之间也会胡星排斥。然而多个读操作读取同个表时不会互相排斥,所以在这种读多写少的场景下 MyISAM 比使用多版本控制的行级所的 InnoDB 表现的性能要好。
InnoDB 采用的是多版本行级锁,所谓多版本行级锁,简单的来讲就是 InnoDB 会为没行记录增加一个类似于版本库的队列,读操作获取到的是当前操作的版本的上一个版本,保证读取到的内容是上一次操作保存好的数据,在写操作的时候会锁定当前版本的数据行,完毕后该数据行的版本加 1。这样,在写和更新某一行记录的时候才加锁,读的是上一版本的数据,从而给读写都频繁的场景下提供了更高的并发性。
Mysql InnoDB与MyISAM
锁定机制
InnoDB 采用行级锁,MyISAM表级锁;行级锁在锁定上带来的消耗大于表级锁,但在系统并发访问量较高时,InnoDB整体性能远高于MyISAM。
索引
InnoDB索引不仅缓存索引本身,也缓存数据,所以InnoDB需要更大内存。
事务
InnoDB支持事务
选择数据库引擎
读写比:(R/W)在数据库中执行show global status 得到系统当前状态。
Com_xxx 语句表示xxx语句执行的次数,通过计算读类型与写类型的比例可以粗略估计读写比例。理想读写比为100/1当读写比打到10/1时可以认定为以写为主的数据库。
MySQL事务处理和锁机制
1. 事务处理和并发性
1.1. 基础知识和相关概念
1 )全部的表类型都可以使用锁,但是只有 InnoDB 和 BDB 才有内置的事务功能。
2 )使用 begin 开始事务,使用 commit 结束事务,中间可以使用 rollback 回滚事务。
3 )在默认情况下, InnoDB 表支持一致读。
SQL 标准中定义了 4 个隔离级别: read uncommited , read commited , repeatable read , serializable 。
read uncommited 即脏读,一个事务修改了一行,另一个事务也可以读到该行。
如果第一个事务执行了回滚,那么第二个事务读取的就是从来没有正式出现过的值。 ?
read commited 即一致读,试图通过只读取提交的值的方式来解决脏读的问题,但是这又引起了不可重复读取的问题。
一个事务执行一个查询,读取了大量的数据行。在它结束读取之前,另一个事务可能完成了对数据行的更改。当第一个事务试图再次执行同一个查询,服务器就会返回不同的结果。
repeatable read 即可重复读,在一个事务对数据行执行读取或写入操作时锁定了这些数据行。
但是这种方式又引发了幻想读的问题。
因为只能锁定读取或写入的行,不能阻止另一个事务插入数据,后期执行同样的查询会产生更多的结果。
serializable 模式中,事务被强制为依次执行。这是 SQL 标准建议的默认行为。
4 )如果多个事务更新了同一行,就可以通过回滚其中一个事务来解除死锁。
5 ) MySQL 允许利用 set transaction 来设置隔离级别。
6 )事务只用于 insert 和 update 语句来更新数据表,不能用于对表结构的更改。执行一条更改表结构或 begin 则会立即提交当前的事务。
7 )所有表类型都支持表级锁,但是 MyISAM 只支持表级锁。
8 )有两种类型的表级锁:读锁和写锁。
读锁是共享锁,支持并发读,写操作被锁。
写锁是独占锁,上锁期间其他线程不能读表或写表。
8 )如果要支持并发读写,建议采用 InnoDB 表,因为它是采用行级锁,可以获得更多的更新性能。
9 )很多时候,可以通过经验来评估什么样的锁对应用程序更合适,不过通常很难说一个锁比别的更好,这全都要依据应用程序来决定,不同的地方可能需要不同的锁。当前 MySQL 已经支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁了, BDB 表支持页级锁, InnoDB 表支持行级锁。
10 ) MySQL 的表级锁都是写锁优先,而且是采用排队机制,这样不会出现死锁的情况。对于 InnoDB 和 BDB 存储引擎来说,是可能产生死锁的。这是因为 InnoDB 会自动捕获行锁, BDB 会在执行 SQL 语句时捕获页锁的,而不是在事务的开始就这么做。
1.2. 不同锁的优缺点及选择
行级锁的优点及选择 :
1 )在很多线程请求不同记录时减少冲突锁。
2 )事务回滚时减少改变数据。
3 )使长时间对单独的一行记录加锁成为可能。
行级锁的缺点 :
1 )比页级锁和表级锁消耗更多的内存。
2 )当在大量表中使用时,比页级锁和表级锁更慢,因为他需要请求更多的所资源。
3 )当需要频繁对大部分数据做 GROUP BY 操作或者需要频繁扫描整个表时,就明显的比其它锁更糟糕。
4 )使用更高层的锁的话,就能更方便的支持各种不同的类型应用程序,因为这种锁的开销比行级锁小多了。
5 )可以用应用程序级锁来代替行级锁,例如 MySQL 中的 GET_LOCK() 和 RELEASE_LOCK() 。但它们是劝告锁(原文: These are advisory locks ),因此只能用于安全可信的应用程序中。
6 )对于 InnoDB 和 BDB 表, MySQL 只有在指定用 LOCK TABLES 锁表时才使用表级锁。在这两种表中,建议最好不要使用 LOCK TABLES ,因为 InnoDB 自动采用行级锁, BDB 用页级锁来保证事务的隔离。
表锁的优点及选择:
1 )很多操作都是读表。
2 )在严格条件的索引上读取和更新,当更新或者删除可以用单独的索引来读取得到时: UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;DELETE FROM tbl_name WHERE unique_key_col=key_value;
3 ) SELECT 和 INSERT 语句并发的执行,但是只有很少的 UPDATE 和 DELETE 语句。
4 )很多的扫描表和对全表的 GROUP BY 操作,但是没有任何写表。
表锁的缺点:
1 )一个客户端提交了一个需要长时间运行的 SELECT 操作。
2 )其他客户端对同一个表提交了 UPDATE 操作,这个客户端就要等到 SELECT 完成了才能开始执行。
3 )其他客户端也对同一个表提交了 SELECT 请求。由于 UPDATE 的优先级高于 SELECT ,所以 SELECT 就会先等到 UPDATE 完成了之后才开始执行,它也在等待第一个 SELECT 操作。
1.3. 如何避免锁的资源竞争
1 )让 SELECT 速度尽量快,这可能需要创建一些摘要表。
2 )启动 mysqld 时使用参数 --low-priority-updates 。这就会让更新操作的优先级低于 SELECT 。
这种情况下,在上面的假设中,第二个 SELECT 就会在 INSERT 之前执行了,而且也无需等待第一个 SELECT 了。
3 )可以执行 SET LOW_PRIORITY_UPDATES=1 命令,指定所有的更新操作都放到一个指定的链接中去完成。
4 )用 LOW_PRIORITY 属性来降低 INSERT , UPDATE , DELETE 的优先级。
5 )用 HIGH_PRIORITY 来提高 SELECT 语句的优先级。
6 )从 MySQL 3.23.7 开始,可以在启动 mysqld 时指定系统变量 max_write_lock_count 为一个比较低的值,它能强制临时地提高表的插入数达到一个特定值后的所有 SELECT 操作的优先级。它允许在 WRITE 锁达到一定数量后有 READ 锁。
7 )当 INSERT 和 SELECT 一起使用出现问题时,可以转而采用 MyISAM 表,它支持并发的 SELECT 和 INSERT 操作。
8 )当在同一个表上同时有插入和删除操作时, INSERT DELAYED 可能会很有用。
9 )当 SELECT 和 DELETE 一起使用出现问题时, DELETE 的 LIMIT 参数可能会很有用。
10 )执行 SELECT 时使用 SQL_BUFFER_RESULT 有助于减短锁表的持续时间。
11 )可以修改源代码 `mysys/thr_lock.c'' ,只用一个所队列。这种情况下,写锁和读锁的优先级就一样了,这对一些应用可能有帮助。
mysql myisam innodb 区别
最近连续接到了两次 tencent 的电话面试,当然不是同一个部门。都涉及到了一个 mysql 的基础知识问题。为了防止第三次打电话来,备注下。^^。 题目 1:讲讲你对 mysql myisam,innodb 的认识。然后你认为他们的区别在那里?为什么?答:这两个是 mysql 主要存储引擎。 简要介绍来自官网。 简要介绍:MyIsam MyISAM 是 默认存储引擎。它基于更老的 ISAM 代码,但有很多有用的扩展。(注意 MySQL 5.1 不支持 ISAM)。 每个 MyISAM 在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm 文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。 简要介绍:InnoDB InnoDB 给 MySQL 提供 了具有提交,回滚和崩溃恢复能力的事务安全(ACID 兼容)存储引擎。InnoDB 锁定在行级并且也在 SELECT 语句提供一个 Oracle 风格一致的非锁定读。这些特色增加 了多用户部署和性能。没有在 InnoDB 中扩大锁定的需要,因为在 InnoDB 中行级锁定适合非常小的空间。InnoDB 也支持 FOREIGN KEY 强制。在 SQL 查询中,你可以自由地将 InnoDB 类型的表与其它 MySQL 的表的类型混合起来,甚至在同一个查询中也可以混合。 InnoDB 是为处理巨大数据量时的最大性能设计。它的 CPU 效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。 InnoDB 存储引擎被完全与 MySQL 服务器整合,InnoDB 存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB 存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与 MyISAM 表不同,比如在 MyISAM 表中每个表被存在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为 2GB 的操作系统上。 InnoDB 默认地被包含在 MySQL 二进制分发中。Windows Essentials installer 使 InnoDB 成为 Windows 上 MySQL 的 默认表。 InnoDB 被用来在众多需要高性能的大型数据库站点上产生。著名的 Internet 新闻站点 Slashdot.org 运行在 InnoDB 上。Mytrix, Inc. 在 InnoDB 上存储超过 1TB 的数据,还有一些其它站点在 InnoDB 上处理平均每秒 800 次插入 / 更新的负荷。 简单概括几点如下:通过不上不难看出,MyIsam InnoDB 的用途,Myisam 主要适用于中小型数据量。InnoDB 引擎适用于大数据量。上面已经讲得很清楚拉。著名的开源电子商务系统 [magento] 就是采用 InnoDB 创建。 MyIsam 写入速度比 InnoDB 快。 在使用 InnoDB 时候需要对 my.cnf 进行配置以保证 mysql 达到最大效率。详细可以查看官网 [inndo 性能调节]:http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb-tuning。 其中有很多人在网上发表了关于 mysql MyIsam 和 InnoDB 在存贮和读取方面的差异。暂时还没有做过度研究。 基本测试都是基于使用[事务]和不使用[事务],进行对比。mysql 对于[非事务表]速度会比较块。 原因:待查证。 猜测:设定了 innodb_flush_log_at_trx_commit 如果设置为 1 的话,那么每次插入数据的时候都会自动提交,导致性能急剧下降,应该是跟刷新日志有关系,设置为 0 效率能够看到明显提升,当然,同样你可以 SQL 中提交 [SET AUTOCOMMIT = 0] 来设置达到好的性能。另外,还听说通过设置 innodb_buffer_pool_size 能够提升 InnoDB 的性能。 通过上面的分析,在我们采用 mysql 存储引擎的时候要按需分配。针对不同的存储引擎要采用不同的数据设计。 题目 2:开发过程中,遇到糟糕的 sql 语句你是怎么解决的。 答:使用 mysql 的[EXPLAIN]对 sql 进行解释。因该还有更多好方法。 mysql 常见问题可以查看:http://www.blags.org/mysql-error-daquan-and-solutions/mysql 存储引擎的介绍 :http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html 以上如有不足之处,请大家帮忙补充,thk。MySQL MyISAM 转 Innodb
在开发时有时因需要把myisam数据库要转换成innodb数据库,这样的方法经常碰到,因为innodb支持存储过程等很多myisam不支持的类型,所在这里提供了一个方法,有需要的朋友可以参考一下。
! rm -f /tmp/ivan_alter.sql #预删除临时文件,方式下面的语句无法写入
代码如下 | 复制代码 |
! rm -f /tmp/ivan_alter.sql |
#执行完后删除临时文件
我们今天的关于为相当大的数据库进行MySQL备份的最佳方法(MyISAM / InnoDB)和在当前数据库中对表employee做一个备份的分享已经告一段落,感谢您的关注,如果您想了解更多关于Mysql InnoDB 和 MyISAM 的区别、Mysql InnoDB与MyISAM、mysql myisam innodb 区别、MySQL MyISAM 转 Innodb的相关信息,请在本站查询。
本文标签: