@TOC
目录
指定utf8编码格式和utf8_general_ci校验规则创建数据库
[2)SELECT INTO...OUTFILE](#2)SELECT INTO…OUTFILE)
MySQL库的操作
创建数据库
创建数据库的SQL语句如下:
CREATE DATABASE [IF NOT EXISTS] db_name [[DEFAULT] CHARSET=charset_name] [[DEFAULT] COLLATE=collation_name];
注:
- SQL中大写的表示关键字,[ ]中代表的是可选项。
- CHARSET用于指定数据库所采用的编码格式。
- COLLATE用于指定数据库所采用的校验规则。
如果创建数据库时未指明数据库的编码格式或校验规则,则默认使用MySQL配置文件中对应的编码格式或校验规则。MySQL配置文件的默认绝对位置在/etc/my.cnf。
创建数据库案例
采用默认的编码格式和校验规则创建数据库
创建数据库时不指明数据库的编码格式和校验规则即可。如下:
**注:**如果没有对MySQL的配置文件进行过修改,则默认的编码格式是utf8,默认的校验规则是utf8_general_ci。
指定utf8编码格式创建数据库
创建数据库时通过charset指明数据库的编码格式即可。如下:
注意: SQL中的charset=utf8,也可以写成character set=utf8或character set utf8。
指定utf8编码格式和utf8_general_ci校验规则创建数据库
创建数据库时通过charset和collate分别指明数据库的编码格式和校验规则即可。如下:
注意: SQL中的collate=utf8_general_ci,也可以写成collate utf8_general_ci。
并且每次创建一个新的数据库都会出现一句话:Query OK, 1 row affected (0.00 sec);"
- "Query OK"表示上面的命令执行成功,
- "1 row affected"表示操作只影响了数据库中一行的记录,
- "0.00 sec"则记录了操作执行的时间,处理时间为 0.00秒。时间为 0.00 秒并不代表没有花费时间,而是时间非常短,小于 0.01 秒。
字符串集和校验规则
查看系统默认字符集以及校验规则
查看系统默认的字符集
通过查看MySQL系统变量variables中的character_set_database,可以得知系统默认的字符集。如下:
注: 如果是在指定数据库下使用该SQL,则查看的是该数据库对应的字符集。
查看系统默认的字符集校验规则
通过查看MySQL系统变量variables中的collation_database,可以得知系统默认的字符集校验规则。如下:
注意: 如果是在指定数据库下使用该SQL,则查看的是该数据库对应的字符集校验规则。
查看数据库支持的字符集
使用show charset
可以查看数据库支持的字符集。如下:
注: 字符集主要是控制用什么语言,比如utf8就可以使用中文。
查看数据库支持的字符集校验规则
使用show collation
可以查看数据库支持的字符集校验规则。如下:
校验规则对数据库的影响
现在我们知道了,为了保证读取的数据和存储的数据是一致的,因此字符集编码格式和校验规则必须是对应的。但实际同一中字符集编码格式一般会有多种可选择的校验规则,比如utf8编码格式的校验规则有utf8_general_ci、utf8_bin、utf8_unicode_ci等校验规则。
使用不同的校验规则操作数据库中的数据可能会得到不同的结果,比如utf8_general_ci校验规则在比对数据时是不区分大小写的,而utf8_bin校验规则在对比数据时则是区分大小写的。
操作数据库时采用utf8_bin校验规则
创建数据库时指定数据库的校验规则为utf8_bin,数据库的编码格式默认为utf8。如下:
在该数据库中创建一个简单的person表,由于创建未指定表的编码格式和校验规则,因此person表将继承当前数据库的编码格式和校验规则。如下:
向表中插入一些数据。如下:
通过select语句可以查看插入表中的数据。如下:
这时指定查看表中name='alice'
的记录时会将Alice和alice一并筛选出来,根本原因就是utf8_bin校验规则在进行数据比对时是区分大小写的。如下:
操作数据库时采用utf8_general_ci校验规则
创建数据库时指定数据库的校验规则为utf8_general_ci,数据库的编码格式默认为utf8。如下:
在该数据库中创建一个简单的person表,由于创建未指定表的编码格式和校验规则,因此person表将继承当前数据库的编码格式和校验规则。如下:
向表中插入一些数据。如下:
通过select语句可以查看插入表中的数据。如下:
但这时指定查看表中name='alice'
的记录时只会将alice筛选出来,根本原因就是utf8_general_ci校验规则在进行数据比对时是不区分大小写的。如下:
操作数据库
查看数据库
使用show database
可以查看系统中所有的数据库。如下:
显示创建语句
使用show create database 数据库名
可以查看对应数据库的创建语句。如下:
注:
- MySQL建议SQL中的关键字使用大写,但不是必须的。
- 数据库的名字加上反引号,是为了防止使用的数据库名与关键字冲突。
- /*!40100 DEFAULT CHARACTER SET utf8 */不是注释,它表示当前MySQL版本如果大于4.10,则执行后面的SQL语句。
修改数据库
修改数据库的语句如下:
ALTER DATABASE db_name [[DEFAULT] CHARSET=character_name] [[DEFAULT] COLLATE=collation_name];
注:对数据库的修改主要指的是修改数据库的字符集或校验规则。
比如将数据库的字符集改为gbk,并将数据库的校验规则改为gbk_bin。如下:
删除数据库
删除数据库的语句如下:
DROP DATABASE [IF EXISTS] db_name;
删除数据库后该数据库对应的文件夹就被删除了。比如:
此时数据库 db1 不存在。再次执行相同的命令,直接使用 drop database db1,系统会报错,如下所示:
如果使用IF EXISTS
从句,可以防止系统报此类错误,如下所示:
使用 drop database 命令时要非常谨慎,在执行该命令后,MySQL 不会给出任何提示确认信息。drop database 删除数据库后,数据库中存储的所有数据表和数据也将一同被删除,而且不能恢复。因此最好在删除数据库之前先将数据库进行备份。
MySQL数据库备份与恢复
为什么数据库需要备份
任何数据库都需要备份,备份数据是维护数据库必不可少的操作。
在学习如何备份数据之前,我们先了解一下数据库备份是为了应对哪些场景?为什么数据库需要备份?
备份就是为了防止原数据丢失,保证数据的安全。当数据库因为某些原因造成部分或者全部数据丢失后,备份文件可以帮我们找回丢失的数据。因此,数据备份是很重要的工作。
常见数据库备份的应用场景如下。
数据丢失应用场景:
- 人为操作失误造成某些数据被误操作
- 软件 BUG 造成部分数据或全部数据丢失
- 硬件故障造成数据库部分数据或全部数据丢失
- 安全漏洞被入侵数据恶意破坏
非数据丢失应用场景:
- 特殊应用场景下基于时间点的数据恢复
- 开发测试环境数据库搭建
- 相同数据库的新环境搭建
- 数据库或者数据迁移
MySQL备份类型
根据备份的方法(是否需要数据库离线)可以将备份分为:
- 热备(Hot Backup)
- 冷备(Cold Backup)
- 温备(Warm Backup)
热备份可以在数据库运行中直接备份,对正在运行的数据库操作没有任何的影响,数据库的读写操作可以正常执行。这种方式在 MySQL 官方手册中称为 Online Backup(在线备份)。
冷备份必须在数据库停止的情况下进行备份,数据库的读写操作不能执行。这种备份最为简单,一般只需要复制相关的数据库物理文件即可。这种方式在 MySQL 官方手册中称为 Offline Backup(离线备份)。
温备份同样是在数据库运行中进行的,但是会对当前数据库的操作有所影响,备份时仅支持读操作,不支持写操作。
按照备份后文件的内容,热备份又可以分为:
- 逻辑备份
- 裸文件备份
在 MySQL 数据库中,逻辑备份是指备份出的文件内容是可读的,一般是文本内容。内容一般是由一条条 SQL 语句,或者是表内实际数据组成。如 mysqldump 和 SELECT * INTO OUTFILE 的方法。这类方法的好处是可以观察导出文件的内容,一般适用于数据库的升级、迁移等工作。但其缺点是恢复的时间较长。
裸文件备份是指复制数据库的物理文件,既可以在数据库运行中进行复制(如 ibbackup、xtrabackup 这类工具),也可以在数据库停止运行时直接复制数据文件。这类备份的恢复时间往往比逻辑备份短很多。
按照备份数据库的内容来分,备份又可以分为:
- 完全备份
- 部分备份
完全备份是指对数据库进行一个完整的备份,即备份整个数据库,如果数据较多会占用较大的时间和空间。
部分备份是指备份部分数据库(例如,只备份一个表)。
部分备份又分为:
- 增量备份
- 差异备份
增量备份需要使用专业的备份工具。指的是在上次完全备份的基础上,对更改的数据进行备份。也就是说每次备份只会备份自上次备份之后到备份时间之内产生的数据。因此每次备份都比差异备份节约空间,但是恢复数据麻烦。
差异备份指的是自上一次完全备份以来变化的数据。和增量备份相比,浪费空间,但恢复数据比增量备份简单。
MySQL 中进行不同方式的备份还要考虑存储引擎是否支持,如 MyISAM 不支持热备,支持温备和冷备。而 InnoDB 支持热备、温备和冷备。
一般情况下,我们需要备份的数据分为以下几种:
- 表数据
- 二进制日志、InnoDB 事务日志
- 代码(存储过程、存储函数、触发器、事件调度器)
- 服务器配置文件
下面是几种常用的备份工具:
- mysqldump:逻辑备份工具,适用于所有的存储引擎,支持温备、完全备份、部分备份、对于 InnoDB 存储引擎支持热备。
- cp、tar 等归档复制工具:物理备份工具,适用于所有的存储引擎、冷备、完全备份、部分备份。
- lvm2 snapshot:借助文件系统管理工具进行备份。
- mysqlhotcopy:名不副实的一个工具,仅支持 MyISAM 存储引擎。
- xtrabackup:一款由 percona 提供的非常强大的 InnoDB/XtraDB 热备工具,支持完全备份、增量备份。
冷备份
冷备份的优点如下:
- 备份简单、快速,只要复制相关文件即可。
- 备份文件易于在不同操作系统,不同 MySQL 版本上进行恢复。
- 恢复相当简单,只需要把文件恢复到指定位置即可。
- 恢复速度快,不需要执行任何 SQL 语句,也不需要重建索引。
- 低度维护,高度安全。
冷备份的缺点如下:
- 备份过程中,数据库不能做其它的工作,且必须是关闭状态。
- InnoDB 存储引擎冷备的文件通常比逻辑文件大很多,因为表空间存放着很多其它的数据,如 undo 段,插入缓冲等信息。
- 若磁盘空间有限,只能拷贝到磁带等其它外部存储设备上,速度会很慢。
- 冷备也不总是可以轻易的跨平台。操作系统、MySQL 的版本、文件大小写敏感和浮点数格式都会成为问题。
冷备的备份与恢复过程也很简单。仅仅需要如下几步:
为了保证所备份数据的完整性,在停止 MySQL 数据库服务器之前,需要先执行 FLUSH TABLES 语句将所有数据写入到数据文件的文本文件里。
2)停掉 MySQL 服务,命令(2种方式)如下:
- mysqladmin -uroot -proot shutdown
- NET START mysql
3)备份过程就是复制整个数据目录到远程备份机或者本地磁盘上,Linux 和 Windows 命令如下:
- Scp -r /data/mysql/ root@远程备份机ip:/新的目录
- Copy -r /data/mysql/ 本地新目录
备份到本次磁盘也可以手动复制上述相关目录里的数据文件。
4)恢复过程就更简单了,仅仅需要把已备份的数据目录替换原有的目录就可以了,最后重启 MySQL 服务。
热备份及恢复
与冷备份正好相反,热备份是在数据库处于运行状态时直接备份,不影响现有业务的正常进行。热备份又细分为逻辑备份和裸文件备份,下面我们介绍逻辑备份和冷备份以及它们常用的备份和恢复的方法。
逻辑备份
逻辑备份的最大优点就是对于各种存储引擎,都可以用同样的方法来备份。而冷备份则不同,不同的存储引擎的备份方法也各不相同。因此,对于不同存储引擎混合的数据库,用逻辑备份会更简单一些。
逻辑备份可以说是最简单,也是目前中小型系统最常用的备份方法。逻辑备份主要有以下几种方法:
1)mysqldump
mysqldump 是 MySQL 自带的逻辑备份工具。它的备份原理是通过协议连接到 MySQL 数据库,将需要备份的数据查询出来,然后将查询出的数据转换成对应的 INSERT 语句。当我们需要还原恢复这些数据时,只要执行这些 INSERT 语句,就能将对应的数据还原。所以有的资料也将这种备份方式称为 INSERT 备份。
恢复数据时可以使用 mysql -uroot -p < backup.sql
直接调用备份文件执行所有命令,将数据完全恢复到备份时候的状态。如果已经连接上了 MySQL 服务器,那么可以通过 source /path/backup.sql
来进行恢复。
2)SELECT INTO...OUTFILE
SELECT INTO...OUTFILE 语句可以把表数据导出到一个文本文件中,且能将数据库中的表数据以特定分隔符进行分隔后记录在文本文件中,以达到逻辑备份的效果。
这种备份方式与 mysqldump 方法相比,使用的存储空间更小,数据格式更加清晰明确,编辑方便。但是这种方法只能导出或导入数据的内容,不包括表的结构,如果表的结构文件损坏,则必须先恢复原来的表的结构。而且这种方法不能在同一个备份文件中存在多个表的备份数据,增加了文件维护和恢复的成本。
这种备份方法恢复起来会稍微麻烦一点,需要一个表一个表通过相关命令来进行恢复。当然如果是通过脚本来实现自动多表恢复也是比较方便的。恢复方法有 2 个,一个是通过 MySQL 的 LOAD DATA INFILE 命令来恢复数据,另一种方法就是通过 MySQL 提供的使用工具 mysqlimport 来进行恢复。
3)mydumper
mydumper 是针对 MySQL 数据库备份的一个轻量级第三方的开源工具,备份方式为逻辑备份。它支持多线程,备份速度远高于原生态的 mysqldump 以及其它众多优异特性。与其配套的相应恢复数据为 myloader 工具。DBA 称 mydumper 和 myloader 为备份界的"小钢炮"。
我们可以看出所谓的逻辑备份就是备份 SQL 语句,然后恢复数据时执行备份 SQL,从而实现数据库数据的重现。逻辑备份完成后所形成的文件都可以直接编辑。
逻辑备份的作用如下:
- 通过逻辑备份,我们可以仅仅恢复备份中的部分数据而不需要全部恢复。不会影响不相关的数据;
- 通过全库的逻辑备份,我们可以在新的 MySQL 环境下完全重建出一个与备份时完全一样的数据库,并且不受平台类型限制;
- 通过特定条件的逻辑备份,我们可以将某些特定数据轻松迁移(或者同步)到其它的 MySQL 或另外的数据库环境。
裸文件备份
裸文件备份主要在底层复制数据文件,所以备份速度要比逻辑备份更快。
它的优点就是备份与恢复过程的速度很快,安全可靠,而且在备份过程中不会缩表,不影响现有业务。但它目前还是不能对表结构文件和其它非事务类型的表进行备份。
备份操作(Linux系统命令)
这里介绍如何使用 mysqldump 命令备份数据库。
mysqldump 命令执行时,可以将数据库中的数据备份成一个文本文件。数据表的结构和数据将存储在生成的文本文件中。
备份一个数据库(Linux系统命令)
使用 mysqldump 命令备份一个数据库的语法格式如下:
mysqldump -u username -p dbname [tbname ...]> filename.sql
对上述语法参数说明如下:
- username:表示用户名称;
- dbname:表示需要备份的数据库名称;
- tbname:表示数据库中需要备份的数据表,可以指定多个数据表。省略该参数时,会备份整个数据库;
- 右箭头">":用来告诉 mysqldump 将备份数据表的定义和数据写入备份文件;
- filename.sql:表示备份文件的名称,文件名前面可以加绝对路径。通常将数据库备份成一个后缀名为
.sql
的文件。
注意:mysqldump 命令备份的文件并非一定要求后缀名为.sql
,备份成其他格式的文件也是可以的。例如,后缀名为.txt
的文件。通常情况下,建议备份成后缀名为.sql
的文件。因为,后缀名为.sql
的文件给人第一感觉就是与数据库有关的文件。
上面不是在db4数据库里面创建了一个person的表吗?这里对他进行备份
这是在当前目录下进行的备份,备份之后,目录里面出现了back.sql的文件,查看一下内容
文件中,以"--"开头的都是 SQL 语言的注释。以 "/*!40101" 等形式开头的是与 MySQL 有关的注释。40101 是 MySQL 数据库的版本号,这里就表示 MySQL 4.1.1。如果恢复数据时,MySQL 的版本比 4.1.1 高,"/*!40101"和"*/"之间的内容被当作 SQL 命令来执行。如果比 4.1.1 低,"/*!40101"和"*/"之间的内容被当作注释。"/*!"和"*/"中的内容在其它数据库中将被作为注释忽略,这可以提高数据库的可移植性。
我们发现备份的内容特别的清晰,甚至把我们的命令都给进行了整理加备份。
DROP 语句、CREATE 语句和 INSERT 语句都是数据库恢复时使用的;"DROP TABLE IF EXISTS 'student' "语句用来判断数据库中是否还有名为 student 的表,如果存在,就删除这个表;CREATE 语句用来创建 student 表;INSERT 语句用来恢复所有数据。文件的最后记录了备份的时间。
注意:上面 student.sql 文件中没有创建数据库的语句,因此,student.sql 文件中的所有表和记录必须恢复到一个已经存在的数据库中。恢复数据时,CREATE TABLE 语句会在数据库中创建表,然后执行 INSERT 语句向表中插入记录。
备份多个数据库(Linux系统命令)
如果要使用 mysqldump 命令备份多个数据库,需要使用 --databases 参数。备份多个数据库的语法格式如下:
mysqldump -u username -p --databases dbname1 dbname2 ... > filename.sql
我们把所有的db数据库都进行备份
这是在当前目录下进行的备份,备份之后,目录里面出现了allback.sql的文件,查看一下内容
备份所有数据库(Linux系统命令)
mysqldump 命令备份所有数据库的语法格式如下:
mysqldump -u username -p --all-databases>filename.sql
使用"--all-databases"参数时,不需要指定数据库名称
恢复操作(Linux系统命令)
在 MySQL 中,可以使用 mysql 命令来恢复备份的数据。mysql 命令可以执行备份文件中的 CREATE 语句和 INSERT 语句,也就是说,mysql 命令可以通过 CREATE 语句来创建数据库和表,通过 INSERT 语句来插入备份的数据。
mysql 命令语法格式如下:
mysql -u username -p [dbname] < filename.sql
其中:
- username 表示用户名称;
- dbname 表示数据库名称,该参数是可选参数。如果 filename.sql 文件为 mysqldump 命令创建的包含创建数据库语句的文件,则执行时不需要指定数据库名。如果指定的数据库名不存在将会报错;
- filename.sql 表示备份文件的名称。
恢复操作(MySQL命令)
source 数据库备份存储的文件路径
一口气恢复了四个数据库。
查看连接情况
使用show processlist
即可查看当前连接MySQL的用户。比如:
- Id列:一个标识,可以在MySQL中通过kill id杀死指定id的线程。
- User列:显示当前用户,如果不是root,这个命令就只显示你权限范围内的SQL语句。
- Host列:显示这个语句是从哪个IP的哪个端口上发出的,可用来追踪出问题语句的用户。
- db列:当前执行的命令是在哪一个数据库上,如果没有指定数据库,则该值为NULL。
- Command列:显示当前连接执行的命令,一般就是休眠(Sleep)、查询(Query)和连接(Connect)。
- Time列:表示该线程处于当前状态的时间,单位是秒。
- State列:显示使用当前连接的SQL语句的状态。
- Info列:一般记录的是线程执行的语句,默认只显示前100个字符,如果要看全部信息,需要使用show full processlist。
show processlist可以告诉我们当前有哪些用户连接到我们的MySQL,如果查出某个用户不是你正常登录的,那么很有可能你的数据库被人入侵了,以后如果发现自己的数据库比较慢时,可以用这个SQL来查看数据库连接情况。