备份mysql
MySQL服务实例运行期间,意外的停电,硬盘损坏,还有一些误操做、服务器宕机等状况。这个时候如何确保数据库可以最大程度地恢复到'正确'的状态呢?sql
对于数据库管理人员来讲,防止数据丢失最简单的方法就是:对原始数据按期进行备份,建立数据副本。但数据与预期发生不一致状况,而后使用备份的数据恢复数据。对于MySQL来讲,建立数据副本的经常使用方法有三种数据库
建立数据副本的方法 服务器
一、数据备份:ide
由MySQL日志系统前一篇博客咱们知道数据库的所有数据都以文件的形式,存储在硬盘上,那咱们就能够直接备份MySQL的全部数据目录下的文件就可以达到目的。所以在开启MySQL服务的时候要设计好各类数据文件以及日志文件的存放位置,以方便可以快速备份。另外备份的时候最好可以备份到其余的机器上。工具
二、使用二进制日志:spa
上面的【数据备份方法】属于物理备份,粒度较粗,不能实现更细粒度的数据恢复,特别是对于更新较为频繁的系统。二进制日志记录了数据库全部的更新操做,数据丢失时,能够经过彻底备份进行二进制日志的重作,能够完成基于时间点或者操做点的恢复,继而实现数据库更细粒度的恢复。设计
三、数据库复制:日志
数据库的复制其实是经过二进制日志预防数据丢失的,数据复制能够实现数据库的异地备份和恢复。索引
逻辑备份与物理备份
按照备份后产生的副本文件是否能够编辑,能够将MySQL的备份方法分为逻辑备份和物理备份
一、逻辑备份:
使用逻辑备份是,数据库管理员一般能够直接查看和编辑副本文件中的内容。逻辑备份中产生的副本一般哟两种状况。情形一:副本是SQL文件,该SQL文件中有crete table 和大量的inert 语句。情形2、副本是指定分隔符的文件,导入数据库的时候再以指定分隔符切割数据导入便可。
二、物理备份:
物理备份产生的数据副本都是二进制文件,经常不可编辑,例如数据库的二进制日志。
冷备份、温备份、热备份
数据备份期间,按照是否须要中止MySQL服务实例,能够将MySQL的数据恢复分为:冷备份、温备份、热备份。
一、冷备份:
冷备份是指中止MySQL服务的运行后在进行数据备份,这种备份方法很是简单,可是在服务繁忙的系统中,并不容许这样作。
二、温备份: 温备份介于热备份与冷备份之间,温备份容许MySQL服务实例继续运行,备份数据期间,温备份借助读锁机制保证备份期间,没有新的数据写入。
彻底备份、增量备份
按照副本文件的缺失程度能够将数据备份分为彻底备份以及增量备份。
一、彻底备份:
彻底备份是一个完整的数据备份,仅仅依靠该副本文件就能够将数据库恢复到某个正确的状态。若是不借助热备份工具,彻底备份可能须要中止MySQL服务。此时MySQL将没法提供服务,在真实的业务场景中,不多真正使用彻底备份。
二、增量备份:
增量备份是指在彻底备份的基础上,对更新的数据进行备份,恢复时须要借助彻底备份产生的副本文件,目前,MySQL尚未提供真正的增量备份工具。数据库管理人员可使用热备份工具模拟实现增量备份,也能够经过从新执行二进制日志中的更新语句模拟实现增量备份。
三、热备份:
热备份是指不须要中止MySQL服务实例运行,备份数据的方法。若是数据库的更新操做较为频繁,在数据备份期间,备份过的数据可能早已发生变化,所以热备份的实现方式较为复杂。
一、备份命令mysqldump格式
格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 –database 数据库名 > 文件名.sql
首先建立一个数据库和表
mysql> create database mood; Query OK, 1 row affected (0.00 sec) mysql> use mood Database changed mysql> create table info (id int not null primary key auto_increment,name char(10) not null); Query OK, 0 rows affected (0.03 sec) mysql> insert into info -> (name)values('zhangsan'),('lisi'); Query OK, 2 rows affected (0.03 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select *from info; +----+----------+ | id | name | +----+----------+ | 1 | zhangsan | | 2 | lisi | +----+----------+ 2 rows in set (0.00 sec)
使用tar命令备份
[root@localhost opt]# tar jvcf /opt/mysql-.tar.xz /usr/local/mysql/data/ [root@localhost opt]# ls allback.sql back1.sql mood.sql mysql-2018-09-02.tar.xz mysql-5.7.17 rh
备份单个MySQL数据库到opt下。(后面出现的warning是由于我把密码写在了-P后面,若是不写则进行密码交互)。
[root@localhost ~]# mysqldump -uroot -pabc123 mood > /opt/mood.sql mysqldump: [Warning] Using a password on the command line interface can be insecure.
备份服务器上全部数据库到opt下。
[root@localhost ~]# mysqldump -uroot -pabc123 --all-databases > /opt/allback.sql mysqldump: [Warning] Using a password on the command line interface can be insecure.
多个数据库同时备份(备份了mood和自带的mysql两个数据库)
[root@localhost opt]# mysqldump -uroot -pabc123 --databases mood mysql > /opt/mood-mysql.sql mysqldump: [Warning] Using a password on the command line interface can be insecure.
备份数据库中的表
[root@localhost opt]# mysqldump -uroot -pabc123 mood info > /opt/info.sql mysqldump: [Warning] Using a password on the command line interface can be insecure.
备份表结构
[root@localhost opt]# mysqldump -uroot -pabc123 -d mood info > /opt/info1.sql mysqldump: [Warning] Using a password on the command line interface can be insecure.
恢复表数据的两种办法
1再数据库中执行
mysql> use mood Database changed mysql> drop table info; Query OK, 0 rows affected (0.01 sec) mysql> show tables; Empty set (0.01 sec) mysql> source /opt/info.sql; Query OK, 0 rows affected (0.00 sec) mysql> show tables; +----------------+ | Tables_in_mood | +----------------+ | info | +----------------+ 1 row in set (0.00 sec)
2直接倒回表数据
[root@localhost opt]# mysql -uroot -pabc123 mood < /opt/info.sql mysql: [Warning] Using a password on the command line interface can be insecure.
不进入数据库使用-e直接查看数据表
[root@localhost opt]# mysql -uroot -pabc123 -e 'use mood;show tables;select *from info;' mysql: [Warning] Using a password on the command line interface can be insecure. +----------------+ | Tables_in_mood | +----------------+ | info | +----------------+ +----+----------+ | id | name | +----+----------+ | 1 | zhangsan | | 2 | lisi | +----+----------+
MySQL索引的创建对于MySQL的高效运行是很重要的,索引能够大大提升MySQL的检索速度。
打个比方,若是合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一我的力三轮车。
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表能够有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。
建立索引时,你须要确保该索引是应用在 SQL 查询语句的条件(通常做为 WHERE 子句的条件)。
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
上面都在说使用索引的好处,但过多的使用索引将会形成滥用。所以索引也会有它的缺点:虽然索引大大提升了查询速度,同时却会下降更新表的速度,如对表进行INSERT、UPDATE和DELETE。由于更新表时,MySQL不只要保存数据,还要保存一下索引文件。
创建索引会占用磁盘空间的索引文件。
这是最基本的索引,它没有任何限制。它有如下几种建立方式:
CREATE INDEX indexName ON mytable(username(length));
若是是CHAR,VARCHAR类型,length能够小于字段实际长度;若是是BLOB和TEXT类型,必须指定 length。
ALTER table tableName ADD INDEX indexName(columnName)
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );
DROP INDEX [indexName] ON mytable;
它与前面的普通索引相似,不一样的就是:索引列的值必须惟一,但容许有空值。若是是组合索引,则列值的组合必须惟一。它有如下几种建立方式:
CREATE UNIQUE INDEX indexName ON mytable(username(length))
ALTER table mytable ADD UNIQUE [indexName] (username(length))
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
有四种方式来添加数据表的索引:
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是惟一的,且不能为NULL。
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句建立索引的值必须是惟一的(除了NULL外,NULL可能会出现屡次)。
ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现屡次。
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。
如下实例为在表中添加索引。
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
你还能够在 ALTER 命令中使用 DROP 子句来删除索引。尝试如下实例删除索引:
mysql> ALTER TABLE testalter_tbl DROP INDEX c;
主键只能做用于一个列上,添加主键索引时,你须要确保该主键默认不为空(NOT NULL)。实例以下:
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL; mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
你也可使用 ALTER 命令删除主键:
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
删除主键时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。
你可使用 SHOW INDEX 命令来列出表中的相关的索引信息。能够经过添加 \G 来格式化输出信息。
尝试如下实例:
mysql> SHOW INDEX FROM table_name; \G ........