【MySQL学生手册】binary备份 vs 文本备份

本文地址:https://www.askmaclean.com/archives/mysql-binary-vs-text-backup.html

 

 

11.2 binary备份 vs 文本备份

 

当备份数据库时,你有两种备份格式可选:

  • 二进制(binary)备份是一种对数据库中存储的内容文件的拷贝。这种拷贝实际上使得备份文件格式和MySQL在磁盘上存储的数据库文件格式保持了完全一致。因此此类数据库恢复则涉及将这些文件拷贝回它原有的位置。建立binary备份的技术包括使用文件拷贝命令(如cp或tar),mysqlhotcopy以及InnoDB Hot Backup**。
    ** 需要注意的是mysqlhotcopy从MySQL 5.7及其之后就被去除了,相关功能被融合到了其企业版MySQL Enterprise Backup工具mysqlbackup中。而InnoDB Hot Backup原先是商用软件的一部分,在MySQL Enterprise Backup 3.9之后其相应工具也被融合入mysqlbackup中。
  • 文本备份则是将数据库内容导出(dump)至文件文件中。恢复则涉及到通过处理这些文件的内容将数据返回到数据库中。生成文本备份的技术包括了使用SELECT … INTO OUTFILE 的SQL语句,mysqldump工具等。

 

这两种备份格式有其不同的优缺点。通常选择使用何种备份的考虑因素是对速度和便携性之间的权衡。

 

由于二进制备份仅是对文件进行拷贝操作,它不需要了解文件中的内部结构,因此在速度上这种备份速度会更快。然而,如果需要将这种备份传输到另一个使用不同架构的机器上,那么文件就需要更多考虑二进制的便携性。意思就是这些文件需要平台无关化才行,这样你才能直接拷贝它们,从一个MySQL服务端传输到另一个处于不同服务器上的数据库中,而且这第二个服务端需要能够没有任何问题地访问这些文件的内容。使用二进制备份方法,你还需要确保在进行备份的时候,服务端不会对在被拷贝的文件进行修改。

[Read more…]

【MySQL学生手册】备份和恢复

本文地址:https://www.askmaclean.com/archives/mysql-backup_recovery_knowledge.html

 

 

第11章 备份和恢复

 

章节概述

本章介绍了MySQL数据备份和恢复。你将学习并了解:

  • 备份的类型
  • 进行二进制备份和文本备份
  • 备份中日志和状态文件的角色作用
  • 使用一个复制从库(replication slave)来进行备份
  • 进行数据恢复
  • 倒入数据文件

 

11.1 备份概述

MySQL数据库备份一般用于应对可能的系统崩溃或硬件故障而导致的数据损失或讹误问题。备份同样对于用户误操作,如误删数据库或表等恢复有帮助。也有时候备份被用于将数据库拷贝或移动到另一个服务器中,如当你需要进行MySQL安装迁移,或建立一个复制从库时。

 

备份可以是对数据文件的直接拷贝,或是通过设计程序来完成同样的备份目的。这些程序包括mysqldump,mysqlhotcopy和InnoDB Hot Backup。

 

对于数据库运维,备份总是必要的,不过备份仅仅是在数据受损后所需进行数据恢复的组件之一。其它的你还需要二进制日志(binary log)文件,它包含了数据修改的记录。进行数据库恢复时,你使用备份将数据库恢复到备份时的状态,然后重新执行binary log中包含的语句来应用备份后的数据修改。

 

这里列出了在进行备份时需要记住的一些原则:

  • 制作一般备份。
  • 启用binary log,这样你在进行备份后,对数据修改的记录将会被保存在日志文件中。
  • 在备份后,使用flush命令,使得服务端从一个新的binary log文件开始,这个日志文件对应了备份的时间(也就是说,将此备份后的日志看作是一个“检查点”,从这个时间后开始的日志记录是备份之后新的数据修改)。
  • 将数据文件目录和你的备份放置在不同的物理设备中,这样一旦某个设备出现故障,不会造成同时被影响的后果。
  • 将你的备份存在在通常合理的文件系统位置中,这样一旦需要就可以从这些位置上找到备份进行恢复。

[Read more…]

【MySQL学生手册】关于InnoDB及MyISAM表的恢复

本文地址:https://www.askmaclean.com/archives/mysql-innodb-myisam-recoveryinfo.html

 

 

 

10.4 修复InnoDB表

在之前的章节中,我们已经了解了可以通过执行CHECK TABLE语句或使用客户端工具来发出此语句,来对InnoDB表进行检查。不过,如果InnoDB表存在问题,那么你并不能使用REPAIR TABLE来对表进行维修,因为这个命令仅对MyISAM可用。

 

如果检查不InnoDB表有问题,那么你应该使用mysqldump来将表恢复到一个一致性状态,即删除表,并通过dump文件进行重建:

shell> mysqldump db_name table_name > dump_file
shell> mysql db_name < dump_file

 

在遇到MySQL服务端奔溃或数据库运行的主机奔溃后,一些InnoDB表可能会需要进行修复。正常情况下,简单的进行服务端重启就行了,因为InnoDB存储引擎在启动时会进行自动恢复作业。少数情况下,可能由于InnoDB自动恢复失败而导致服务端无法启动。如果碰到这样的情况,请按以下步骤进行操作:

  • 使用带有 --innodb-force-recovery(值范围为1~6)的命令项来重启服务端。这个值用于提高警告屏蔽级别以避免启动崩溃,对于被恢复的表,允许更高不一致容忍度。较好是值使用从4开始。
  • 当你启动服务端并使用 --innodb-force-recovery设为一个非0值,InnoDB会将表空间作为只读处理(从7.3版本开始,值为4或更大时,将使得InnoDB置于只读模式)。之后,你应该使用mysqldump工具来倒出InnoDB表数据,并在导出后,在此命令项有效的情况下将InnoDB表删除。然后在不使用 --innodb-force-recovery项的情况下重启服务端。当服务端起来后,再从导出的dump文件来恢复InnoDB表。
  • 如果之前的步骤都失败了,那就有必要从之前的备份来恢复InnoDB表了。

[Read more…]

【MySQL学生手册】表维护中的客户端工具程序

本文地址:https://www.askmaclean.com/archives/mysql-maintenance-tools.html

 

10.3 表维护中的客户端工具程序

之前讨论的表维护SQL语句可以在mysql客户端工具执行,也可以通过其它应用发送给服务端来执行。通过使用这些语句,你可以写一些自己的管理应用程序来进行表的检查和修理操作。

 

一些MySQL客户端程序作为前端可发出表维护命令:

  • MySQL Workbench提供了执行语句的编辑窗口可用于进行表检查,修理和优化操作。当你执行这些操作时,语句会被发至服务端。
  • mysqlcheck可用于检查,维修,分析和优化表。此命令行工具按所提供的命令项来决定发送哪些相适合的SQL语句到MySQL服务端以进行所需操作。

对于MyISAM表,使用myisamchk工具也能进行表维护。然而,它不同于MySQL Workbench和mysqlcheck需要将SQL语句发送到服务端,myisamchk可直接读取并修改表文件。也因为此,请保证在使用myisamchk的同时服务端不会去访问这些表。

 

10.3.1 mysqlcheck客户端程序

mysqlcheck可对表进行的操作有检查,修理,分析和优化。对于MyISAM表,此程序工具可执行所有这些操作,而对于InnoDB表,则只能执行一部分操作。它提供了一种命令行接口方式来执行各种SQL语句(如CHECK TABLE和REPAIR TABLE)以告知服务端进行何种表维护。

 

mysqlcheck在某些情况下比起直接执行SQL语句,可以使得操作变得更容易。例如,如果你指定一个数据库,它包含了需要执行语句来处理的所有表。使用mysqlcheck你就不需要在进行操作时显式地指定每个表,而且,mysqlcheck是一个命令行程序,它可以在工作中被用于周期性计划维护作业。

[Read more…]

【MySQL学生手册】常用存储引擎 – InnoDB

本文地址:https://www.askmaclean.com/archives/mysql-storage-engines-innodb.html

 

 

8.2.2 InnoDB存储引擎

使用InnoDB存储引擎管理的表具有以下等特点:

  • 每个InnoDB表在数据库底层磁盘目录中以一个.frm格式文件代表其存在,而其数据和索引的存储会被放在InnoDB表空间(tablespace
    •   表空间是一个单独的逻辑存储区,其由一个或多个文件或磁盘分区组成。
    •   默认情况下,MySQL仅使用单个InnoDB表空间,其被所有InnoDB表所共享。
    •   表的大小可以超过文件系统所允许最大文件大小。
    •   可以配置InnoDB以建立每个表时使用其自己的表空间
  • 支持事务,可使用COMMIT和ROLLBACK语句
  • 完全遵循ACID原则
  • 在MySQL服务端或运行的主机崩溃后提供自动恢复
  • 提供多版本(Multi-versioning)存储和行级锁(row-level)支持
  • 支持外键和参考一致性,包括级联删除和级联更新。

InnoDB表空间和日志:

InnoDB操作使用两种基于磁盘的资源:一个存储表内容的表空间和一堆记录事务活动的日志文件。

 

每个InnoDB表在数据库磁盘目录中拥有一个.frm格式文件。这和由其它MySQL存储引擎管理的表相同,如MyISAM。然而,InnoDB在管理表内容(数据行和索引)在磁盘上的存储和MyISAM存储引擎不同。默认是,InnoDB使用一个共享的“表空间”,其是由一个或多个文件组成的单个逻辑存储区。所有InnoDB表被存储在此表空间中,但并不是如MyISAM表的针对特定表的对应数据文件和索引文件形式。表空间中还包含有一个回滚段(rollback segment)。当事务修改了行数据,undo日志信息会被存储于此回滚段中,这些信息被用于回滚失败的事务。

[Read more…]

【MySQL学生手册】事务

本文地址:https://www.askmaclean.com/archives/mysql-transactions.html

 

7.4 事务

将多个SQL语句组成为一个具有原子性操作的机制,我们称之为事务。事务中其中所有语句要么执行成功,要么都失败。一旦所有语句执行成功,整个事务对记录数据的操作就会被永久保存下来。如果事务中发生错误,其中进行的所有操作会被回滚并取消,数据库数据将回到其开始事务之前的状态。

 

例如,如果你尝试将1000元钱从一张A银行行转到B卡中,但你发现A卡中扣去了钱,而B卡中1000元未到账,你一定不会高兴。为了避免此类问题,程序中在处理此种需求时,首先会启用一个事务,然后在事务中发送进行欠款转账的命令。只有当所有命令都成功执行后才结束事务。如果在事务中所执行的命令报错,那么事务中所做的所有数据修改就会被回滚到启动事务之前的样子。整个过程看起来像这样:

 

什么是ACID

我们知道事务系统一般都声称其遵循ACID,那什么是ACID呢?

Atomic 原子性。所有语句被作为一个整体单元,执行成功或全部取消。
Consistent 一致性。从事务开始至事务结束,其中数据库的状态始终保持一致。
Isolated 隔离性。一个事务不会对另一个事务产生影响。
Durable 持久性。由事务所产生的数据变更都会被成功记录在数据库中。这些改变不会丢失。

[Read more…]

【MySQL学生手册】协同(Advisory)锁

本文地址:https://www.askmaclean.com/archives/mysql-advisory-lock.html

 

7.3 协同(Advisory)锁

协同锁没有能力避免来自其它客户端的数据访问,但它们基于一种概念,即所有客户端会使用一个约定的规则来协同使用一种资源。这种约定的规则可以是一个锁名,即一个简单的字符串。当这个名字被锁住,此协同锁认为被获取。那么了解到此锁状态的其它的客户端就会抑制并避免其进行和持有锁的用户具有冲突的操作。

 

协同锁使用了一套功能函数实现。为了获取锁,使用GET_LOCK()功能:

第一个参数使用一个字符串定义了被锁的名字,第二个参数是一个以秒为单位的时间值,定义了如果锁无法立刻被获取的情况下,最多等待多长时间。GET_LOCK()但执行成功则返回1,不过如果时间过后,锁还是未能获取,则返回0,执行中异常报错则返回空值。

获取到协同锁的客户端可以调用RELEASE_LOCK()功能来释放锁:

如果锁被成功释放,则RELEASE_LOCK()返回1,如果需要释放的锁是别的客户端锁,则返回0,返回NULL则说明当前名字没有锁。

我们还可以再次通过调用GET_LOCK()来释放之前的锁,或者直接关闭其和服务端之间的连接也可以达到释放锁的目的。

[Read more…]

【MySQL学生手册】显式(Explicit)表锁

本文地址:https://www.askmaclean.com/archives/mysql-explicit-lock.html

7.2 显式(Explicit)表锁

客户端可以使用两个语句来管理显式表锁。LOCK TABLES命令会获取表锁,而UNLOCK TABLES命令则会释放锁。对于显式锁的获取,我们可以具体在某些场景中使用:

 

  • 一个隐式锁仅在对于(非事务引擎下的)单个查询执行时间内起到作用。但是对于希望运行多语句跟新且同时不被其它客户端干扰的情况,则不适用。而在执行由事务引擎支持的事务时,锁可以在整个事务时间范围起作用,为了达到这样的目的,你可以获取一个显式锁来维持其效果直到你释放它,这样其它客户端就不能修改你锁住的那些表了。
  • 使用显式锁,可以在将多个语句作为一组进行执行时发挥作用,从而提高效率。首先,服务端减少了获取和释放锁的工作,因为其不必未每个语句都进行其锁的操作。它仅是在操作的最开始时候获取所有所需的锁,并在事务最后释放它们即可。其二,对于那些修改数据的语句,索引刷新操作次数降低了。例如,如果你执行多个INSERT语句,且都使用隐式锁,那么索引的刷新操作将在每个语句之后进行。如果你对表使用了显式锁,那么索引的刷新仅会在所有插入操作完成并释放锁后进行,这样所产生的磁盘活动就更少了。

 

LOCK TABLES语句可以对指定的表进行锁定,并制定索要获取的锁的类型。如,以下语句会在Country表上要求获取读锁,并对City表要求获取写锁:

mysql> LOCK TABLES Country READ, City WRITE;

为了能成功执行lock tables命令,你必须要有lock tables权限,且需要每个被锁表的select权限。

 

如果所要锁定的表正在被使用,那么执行lock tables会陷入等待,在获取到所需的锁之前它都不会返回。

[Read more…]

【MySQL学生手册】MySQL锁

本文地址:https://www.askmaclean.com/archives/mysql-lock.html

第7章 锁

 

章节概述

本章介绍如何MySQL的锁(Lock)机制。你会了解:

  • 锁的概念
  • 如何使用显式表锁
  • 如何使用协同(advisory)锁

 

7.1 锁的概念

MySQL服务端使用多线程架构,这样使其能够并行地位多个客户端进行服务。对连接的每个客户端来说,服务端分配了一个线程作为其连接处理。如果每个客户端访问不同的表,它们并不会互相干扰对方。然而,当多个客户端尝试在同一时间访问同一张表,会产生争用并需要客户端间协调。如,一个客户端正在修改行而另一个客户端正在读取它们,或两个客户端正在同时修改同一行,这样都会产生问题。为了避免这些问题引发的数据讹误,MySQL使用锁来进行解决。

 

锁是一种避免由于多个客户端同时进行数据访问而引发问题的机制。锁由服务端管理:它会为某个客户端对数据上锁以限制其它客户端对此数据的访问,直到锁被释放。锁仅允许持有它的客户端对被锁的数据进行访问,而对其它对此数据进行争用的客户端限制访问的操作行为。锁机制所起到的效果是为了在多个客户端进行有冲突的操作时,进行等待,以达到顺序化的数据访问。

 

不是所有并行访问都会产生冲突,因此使用什么类型的锁以允许客户端访问数据则取决于客户端到底是希望进行读还是写:

  • 如果一个客户端希望读数据,其它客户端也希望读这同样的数据,这并不会产生冲突,它们可以在同时进行读取。然而,如果其它客户端如果要进行写(修改)数据的话,就需要等到读取完成才能进行。
  • 如果一个客户端希望写数据,所有其它客户端必须等它写完,不管它们要做的操作是写操作还是读操作。

 

换句话说,一个读取器一定会阻碍写,但是不会阻止其它的读取操作。而写则会对其它读和写都进行阻止。读锁和写锁的作用就是允许这些限制被实现。锁使得客户保持等待直到可以安全进行。在这种方式下,锁通过不允许并行冲突来保证避免数据讹误,以有序的方式读取被改变的数据。

[Read more…]

沪ICP备14014813号

沪公网安备 31010802001379号