细聊MySQL的备份与恢复
备份对于数据库来说是相当重要的工作。如果数据库在使用过程中出现了问题,比如系统崩溃、硬件故障或错误的删除了数据。这时,如果我们进行了数据备份,就能比较方便的使数据库恢复工作,并使我们的数据损失到最
备份对于数据库来说是相当重要的工作。如果数据库在使用过程中出现了问题,比如系统崩溃、硬件故障或错误的删除了数据。这时,如果我们进行了数据备份,就能比较方便的使数据库恢复工作,并使我们的数据损失到最小。下面,我从备份类型、备份方法及一些常用的例子来和大家详细探讨下数据库的备份与恢复。
一、备份类别
1、物理备份与逻辑备份
物理备份用人话来形容就是复制数据库的数据文件。如果我们需要备份名为test的数据库,则我们可以将数据目录下的test目录复制到备份设备中。如果我们需要备份test库下名为user的表,则可以根据不同的存储引擎选取不同的数据文件来复制。如user是myisam,则可以复制user.frm,user.MYD,user.MYI文件。如user是innodb,则可以复制user.frm,user.ibd。其中.frm是包含数据结构的文件。.MYD是myisam引擎中包含具体数据的文件。.MYI是myisam引擎中包含索引内容的文件。.ibd是innodb引擎中包含具体数据的文件。
逻辑备份是将数据库的结构对象及数据对象(所有的事件、触发器、存储过程等)转化为SQL语句后再保存到备份文件中。所以逻辑备份与具体的操作平台无关。
物理备份的特征:
1、它是直接复制二进制数据文件的,所以我们在恢复数据时只能原样恢复,不能自定义修改数据文件再恢复。
2、物理备份比逻辑备份速度更快,因为没有转化SQL这一过程。
3、物理备份不支持细粒度的备份,如果你只是想备份某个表中的某一范围的行,可能会难以办到。
4、物理备份可能会丢失最新写入到数据库的数据。因为在物理备份时,可能会有新增的数据还驻留在内存中,没有写入硬盘。
5、物理备份对平台有一定的要求,如果两个操作系统的文件系统不一样,有可能会不能恢复数据。所以要求尽可能在相同的操作系统及文件系统上实现数据的备份与恢复。
6、最好在服务器停止运行时执行物理备份,否则可能需要正确的加锁策略来确保数据一致。
逻辑备份的特征:
1、通过将需备份的数据转换成SQL来完成备份,所以在恢复数据时,我们可以通过修改SQL的方式来自定义恢复的内容,有更大的灵活性。
2、因为特征1的原因,所以在速度方面会比物理备份慢,因此不太适合大量数据的备份。
3、备份力度方面比物理备份更细,可以到行级。
4、不依赖具体的操作系统平台。
5、备份时无需停止服务器。
2、在线备份与离线备份
在线备份是通过远程客户端连到服务器进行备份,如在客户端使用导出工具导出SQL备份文件。在备份时应该在SQL上加合适的锁防止数据不一致的情况。比如写数据时应加写锁以防止导出数据集时发生数据不一致。
离线备份是在服务器停运的状态下进行备份,因为此时不会有数据操作,所以它在实现上更简单。
3、完全备份与增量备份
完全备份就是备份到目前为止的所有数据。增量备份只备份自上一次完全备份或增量备份到至今,期间有所变化的数据。实现完全备份的方法有很多,如使用逻辑备份或者物理备份都可以实现完全备份。完全备份在恢复时是最方便的,但在备份时通常需要耗费很长的时间,所以如果数据库的数据量非常大,每天都执行完全备份是不现实的。应采用完全备份与增量备份相结合的策略。如在每个星期天执行一次完全备份,礼拜一到礼拜五实行增量备份。增量备份的特性与完全备份刚好相反,在备份时会非常的快捷方便,但在还原时会比较繁琐。而且要实现增量备份,我们必须在服务器运行时开启二进制日志。这样我们在恢复时才能根据二进制日志来进行实时恢复。
二、备份方法
物理备份方法通常是用专门的MySQL备份工具或操作系统的相关指令进行的,这里强调一点,就是在进行物理复制的时候,在执行复制之前应给需要备份的表加读锁,并且需要将驻留在内存的索引信息写入I/O,具体命令为FLUSH TABLES WITH READ LOCK。下面我主要介绍下MySQL普通版本下的备份方法。
使用mysqldump实现数据库的逻辑备份。
mysqldump命令在mysql安装目录的bin目录下。主要作用是导出SQL文件。具体语法格式如下:
mysqldump [options] db_name [tbl_name ...] mysqldump [options] --databases db_name ... mysqldump [options] --all-databases
常用的可选参数如下:
参数 | 描述 | 适用 | 废弃 |
---|---|---|---|
--add-drop-database | 在每个 CREATE DATABASE 声明前加上DROP DATABASE 声明 | ||
--add-drop-table | 在每个 CREATE TABLE 声明前加上DROP TABLE 声明 | ||
--add-drop-trigger | 在每个 CREATE TRIGGER 声明前加上DROP TRIGGER 声明 | ||
--add-locks | 在备份时所表 | ||
--all-databases | 备份所有数据库里的所有表 | ||
--allow-keywords | 将表名作为列名的前缀 | ||
--apply-slave-statements | 将STOP SLAVE放在CHANGE MASTER声明前,并将START SLAVE放在结尾 | ||
--comments | 增加注释到备份文件 | ||
--compact | 生成更加紧凑的输出 | ||
--compatible=name[,name,...] | 生成更加兼容的格式 | ||
--complete-insert | 使用完整的 INSERT 声明 | ||
--create-options | 在CREATE TABLE声明里包含所有的MySQL指定选项 | ||
--databases | 备份指定的数据库 | ||
--delete-master-logs | 在执行dump操作后删除master节点的binlog | ||
--disable-keys | 对于每一个表的INSERT声明前加上/*!40000 ALTER TABLE tbl_name DISABLE KEYS */; 和/*!40000 ALTER TABLE tbl_name ENABLE KEYS */,这样可以更快的载入dump文件,但仅仅对具有非唯一索引的MyISAM表有效。 | ||
--dump-date | 包含dump时间 | ||
--extended-insert | 使用批量插入语法 | ||
--flush-logs | 在开始导出前刷新MYSQL server日志文件 | ||
--flush-privileges | 在导出后刷新权限 | ||
--hex-blob | 使用16进制导出二进制列 | ||
--ignore-error=error[,error]... | 跳过指定的错误 | 5.7.1 | |
--ignore-table=db_name.tbl_name | 不导出指定的表 | ||
--insert-ignore | 写INSERT IGNORE 声明,而不是 INSERT 声明 | ||
--lock-all-tables | 锁所有的数据库表 | ||
--lock-tables | 导出前所数据库内的表 | ||
--login-path=name | 同mysql命令 | ||
--max_allowed_packet=value | 同mysql命令 | ||
--net_buffer_length=value | 同mysql命令 | ||
--no-autocommit | 添加 SET autocommit = 0 和COMMIT 声明在每个 INSERT 声明前 | ||
--no-create-db | 不创建 CREATE DATABASE 声明 | ||
--no-data | 不导出表的数据 | ||
--no-defaults | 同mysql命令 | ||
--no-set-names | 不设置字符集 | ||
--no-tablespaces | 不写任何 CREATE LOGFILE GROUP 或 CREATE TABLESPACE 声明 | ||
--opt | --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset的缩写 | ||
--order-by-primary | 按逐渐或唯一索引排序导出数据行 | ||
--quote-names | 添加引用标识 | ||
--replace | 用 REPLACE 声明代替 INSERT 声明 | ||
--result-file=file | 输出文件到指定位置 | ||
--secure-auth | 同mysql命令 | 5.7.4 | 5.7.5 |
--set-charset | 设置字符集 | ||
--set-gtid-purged=value | 增加 SET @@GLOBAL.GTID_PURGED | ||
--shared-memory-base-name=name | 同mysql命令 | ||
--single-transaction | 在导出前写 BEGIN SQL 声明 | ||
--skip-add-drop-table | add-drop-table 反向操作 | ||
--skip-add-locks | add-locks 反向操作 | ||
--skip-comments | comments 反向操作 | ||
--skip-compact | compact 反向操作 | ||
--skip-disable-keys | disable-keys 反向操作 | ||
--skip-extended-insert | extended-insert 反向操作 | ||
--skip-opt | 关闭 --opt 选项 | ||
--skip-quick | quick 反向操作 | ||
--skip-quote-names | quote-names 反向操作 | ||
--skip-set-charset | 不设置字符集 | ||
--skip-triggers | 不导出触发器 | ||
--skip-tz-utc | 关闭 tz-utc 选项 | ||
--tab=path | 生成一个用tab隔开的数据文件。 | ||
--tables | 覆盖 --databases 选项 | ||
--triggers | 导出触发器 | ||
--tz-utc | 针对列中的TIMESTAMP字段,增加SET TIME_ZONE='+00:00'到导出文件中 | ||
--where='where_condition' | 导出符合where条件的行 | ||
--xml | 生成XML输出 |
以下是一个简单的备份例子,如下所示:
/usr/local/mysql/bin/mysql -uroot -p123456 \ -h127.0.0.1 -e"flush tables with read lock” \ #将驻留在内存中的数据写入表中并给所有表添加读锁
/usr/local/mysql/bin/mysqldump -uroot -p123456 \ -h127.0.0.1 --databases test --add-drop-database \ --add-drop-table --extended-insert --create-options > \ /usr/local/mysql/backup/backup.sql #备份test库到backup.sql文件。加了—databases后,会在备份文件里 生成创建数据库CREATE DATABASE test;的声明。否则,如果直接使用 mysqldump test > backup.sql命令则不会生成create database语句。 具体参数的运用可以参考上表,如果数据较大,我们可以使用—opt选项进行备份。
/usr/local/mysql/bin/mysql -uroot -p123456 \ -h127.0.0.1 -e"unlock tables” #解除读锁
三、数据恢复方法
1、mysqldump恢复法
使用mysqldump备份的数据,通常在一个.sql文件中。要恢复数据,只用利用mysql客户端执行备份文件即可。如:
/usr/local/mysql/bin/mysql -uroot -p123456 \ -h127.0.0.1 < /usr/local/mysql/backup/backup.sql
即可
2、二进制日志恢复法
使用此方法的前提是你的服务器是以—log-bin参数运行的,这样服务器才会生成二进制日志。使用二进制日志恢复法需使用mysqlbinlog命令,此命令也在mysql安装目录的bin目录下。恢复命令如下:
/usr/local/mysql/bin/mysqlbinlog xxx-bin.000001 \ | /usr/local/mysql/bin/mysql -uroot -p123456 -h127.0.0.1
诸如此类xxx-bin.000001的格式均为二进制日志文件。xxx-bin.000001里是以二进制存储的对数据库的所有操作,所以此命令执行后会将历史上对数据库的操作进行重做,以此达到恢复数据的目的。值得注意的是,如果你有多个二进制日志文件,如有xxx-bin.000001和xxx-bin.000002这两个文件,如果按以下方式进行恢复将是不安全的:
/usr/local/mysql/bin/mysqlbinlog xxx-bin.000001 \ | /usr/local/mysql/bin/mysql -uroot -p123456 -h127.0.0.1 /usr/local/mysql/bin/mysqlbinlog xxx-bin.000002 \ | /usr/local/mysql/bin/mysql -uroot -p123456 -h127.0.0.1
这样利用两次客户端连线去恢复数据是不安全的,如果在xxx-bin.000001内有一个生成临时表的声明,而在xxx-bin.000002内需要使用这个临时表,则这样操作将出现问题,执行mysqlbinlog xxx-bin.000002时将会找不到这个临时表。所以正确的做法应该是:
/usr/local/mysql/bin/mysqlbinlog xxx-bin.000001 xxx-bin.000002 \ | /usr/local/mysql/bin/mysql -uroot -p123456 -h127.0.0.1
mysqlbinlog恢复数据的方法很灵活,可以通过时间点与位置点进行恢复如:
/usr/local/mysql/bin/mysqlbinlog —start-datetime=‘2014-01-20 8:00:00’\ —stop-datetime=‘2014-01-22 19:00:00' xxx-bin.000001\ | /usr/local/mysql/bin/mysql -uroot -p123456 -h127.0.0.1 #表示重做xxx-bin.000001文件里从2014-01-20 8:00:00到 2014-01-22 19:00:00这个时间范围内的操作。
/usr/local/mysql/bin/mysqlbinlog --start-position=368315\ xxx-bin.000001 | /usr/local/mysql/bin/mysql\ -uroot -p123456 -h127.0.0.1 #表示重做xxx-bin.000001文件内从位置368315开始直到文件末尾的操作。
关于备份与恢复,一般采用完全备份和增量备份结合的方法。这样可以在保证备份效率的基础上达到实时恢复要求。比如让服务器以—log-bin参数运行,然后每个礼拜天进行一次mysqldump。这样,比如2014年12月7号23点59分完成的备份,2014年12月9日7点需要进行恢复。则首先运行mysql

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

Laravel은 웹 응용 프로그램을 쉽게 구축하기위한 PHP 프레임 워크입니다. 설치 : Composer를 사용하여 전 세계적으로 Laravel CLI를 설치하고 프로젝트 디렉토리에서 응용 프로그램을 작성하는 등 다양한 기능을 제공합니다. 라우팅 : Routes/Web.php에서 URL과 핸들러 간의 관계를 정의하십시오. 보기 : 리소스/뷰에서보기를 작성하여 응용 프로그램의 인터페이스를 렌더링합니다. 데이터베이스 통합 : MySQL과 같은 데이터베이스와 상자 외 통합을 제공하고 마이그레이션을 사용하여 테이블을 작성하고 수정합니다. 모델 및 컨트롤러 : 모델은 데이터베이스 엔티티를 나타내고 컨트롤러는 HTTP 요청을 처리합니다.

MySQL 및 Phpmyadmin은 강력한 데이터베이스 관리 도구입니다. 1) MySQL은 데이터베이스 및 테이블을 작성하고 DML 및 SQL 쿼리를 실행하는 데 사용됩니다. 2) PHPMYADMIN은 데이터베이스 관리, 테이블 구조 관리, 데이터 운영 및 사용자 권한 관리에 직관적 인 인터페이스를 제공합니다.

다른 프로그래밍 언어와 비교할 때 MySQL은 주로 데이터를 저장하고 관리하는 데 사용되는 반면 Python, Java 및 C와 같은 다른 언어는 논리적 처리 및 응용 프로그램 개발에 사용됩니다. MySQL은 데이터 관리 요구에 적합한 고성능, 확장 성 및 크로스 플랫폼 지원으로 유명하며 다른 언어는 데이터 분석, 엔터프라이즈 애플리케이션 및 시스템 프로그래밍과 같은 해당 분야에서 이점이 있습니다.

기사 요약 :이 기사는 Laravel 프레임 워크를 쉽게 설치하는 방법에 대한 독자들을 안내하기위한 자세한 단계별 지침을 제공합니다. Laravel은 웹 애플리케이션의 개발 프로세스를 가속화하는 강력한 PHP 프레임 워크입니다. 이 자습서는 시스템 요구 사항에서 데이터베이스 구성 및 라우팅 설정에 이르기까지 설치 프로세스를 다룹니다. 이러한 단계를 수행함으로써 독자들은 라벨 프로젝트를위한 탄탄한 토대를 빠르고 효율적으로 놓을 수 있습니다.

Oracle은 데이터베이스 회사 일뿐 만 아니라 클라우드 컴퓨팅 및 ERP 시스템의 리더이기도합니다. 1. Oracle은 데이터베이스에서 클라우드 서비스 및 ERP 시스템에 이르기까지 포괄적 인 솔루션을 제공합니다. 2. OracleCloud는 AWS와 Azure에 도전하여 IAA, PAAS 및 SAAS 서비스를 제공합니다. 3. E-BusinessSuite 및 FusionApplications와 같은 Oracle의 ERP 시스템은 기업이 운영을 최적화하는 데 도움이됩니다.

MySQL에서 외국 키의 기능은 테이블 간의 관계를 설정하고 데이터의 일관성과 무결성을 보장하는 것입니다. 외국 키는 참조 무결성 검사 및 계단식 작업을 통해 데이터의 효과를 유지합니다. 성능 최적화에주의를 기울이고 사용할 때 일반적인 오류를 피하십시오.

MySQL과 Mariadb의 주요 차이점은 성능, 기능 및 라이센스입니다. 1. MySQL은 Oracle에 의해 개발되었으며 Mariadb는 포크입니다. 2. MariaDB는 높은 하중 환경에서 더 나은 성능을 발휘할 수 있습니다. 3. Mariadb는 더 많은 스토리지 엔진과 기능을 제공합니다. 4.MySQL은 듀얼 라이센스를 채택하고 MariaDB는 완전히 오픈 소스입니다. 선택할 때 기존 인프라, 성능 요구 사항, 기능 요구 사항 및 라이센스 비용을 고려해야합니다.

SQL은 관계형 데이터베이스를 관리하는 표준 언어이며 MySQL은 SQL을 사용하는 데이터베이스 관리 시스템입니다. SQL은 CRUD 작업을 포함한 데이터베이스와 상호 작용하는 방법을 정의하는 반면 MySQL은 SQL 표준을 구현하고 저장 프로 시저 및 트리거와 같은 추가 기능을 제공합니다.
