@TOC
目录
MySQL库的操作
创建数据库
创建数据库案例
采用默认的编码格式和校验规则创建数据库
指定utf8编码格式创建数据库
指定utf8编码格式和utf8_general_ci校验规则创建数据库
字符串集和校验规则
查看系统默认字符集以及校验规则
查看系统默认的字符集
查看系统默认的字符集校验规则
查看数据库支持的字符集
查看数据库支持的字符集校验规则
校验规则对数据库的影响
操作数据库时采用utf8_bin校验规则
操作数据库时采用utf8_general_ci校验规则
操作数据库
查看数据库
显示创建语句
修改数据库
删除数据库
MySQL数据库备份与恢复
为什么数据库需要备份
MySQL备份类型
冷备份
热备份及恢复
逻辑备份
1)mysqldump
2)SELECT INTO…OUTFILE
3)mydumper
裸文件备份
备份操作(Linux系统命令)
备份一个数据库(Linux系统命令)
备份多个数据库(Linux系统命令)
备份所有数据库(Linux系统命令)
恢复操作(Linux系统命令)
恢复操作(MySQL命令)
查看连接情况
创建数据库的SQL语句如下:
CREATE DATABASE [IF NOT EXISTS] db_name [[DEFAULT] CHARSET=charset_name] [[DEFAULT] COLLATE=collation_name];
注:
如果创建数据库时未指明数据库的编码格式或校验规则,则默认使用MySQL配置文件中对应的编码格式或校验规则。MySQL配置文件的默认绝对位置在/etc/my.cnf。
创建数据库时不指明数据库的编码格式和校验规则即可。如下:
注:如果没有对MySQL的配置文件进行过修改,则默认的编码格式是utf8,默认的校验规则是utf8_general_ci。
创建数据库时通过charset指明数据库的编码格式即可。如下:
注意: SQL中的charset=utf8,也可以写成character set=utf8或character set utf8。
创建数据库时通过charset和collate分别指明数据库的编码格式和校验规则即可。如下:
注意: SQL中的collate=utf8_general_ci,也可以写成collate utf8_general_ci。
并且每次创建一个新的数据库都会出现一句话:Query OK, 1 row affected (0.00 sec);”
通过查看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。如下:
在该数据库中创建一个简单的person表,由于创建未指定表的编码格式和校验规则,因此person表将继承当前数据库的编码格式和校验规则。如下:
向表中插入一些数据。如下:
通过select语句可以查看插入表中的数据。如下:
这时指定查看表中name='alice'的记录时会将Alice和alice一并筛选出来,根本原因就是utf8_bin校验规则在进行数据比对时是区分大小写的。如下:
创建数据库时指定数据库的校验规则为utf8_general_ci,数据库的编码格式默认为utf8。如下:
在该数据库中创建一个简单的person表,由于创建未指定表的编码格式和校验规则,因此person表将继承当前数据库的编码格式和校验规则。如下:
向表中插入一些数据。如下:
通过select语句可以查看插入表中的数据。如下:
但这时指定查看表中name='alice'的记录时只会将alice筛选出来,根本原因就是utf8_general_ci校验规则在进行数据比对时是不区分大小写的。如下:
使用show database可以查看系统中所有的数据库。如下:
使用show create database 数据库名可以查看对应数据库的创建语句。如下:
注:
修改数据库的语句如下:
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 官方手册中称为 Online Backup(在线备份)。
冷备份必须在数据库停止的情况下进行备份,数据库的读写操作不能执行。这种备份最为简单,一般只需要复制相关的数据库物理文件即可。这种方式在 MySQL 官方手册中称为 Offline Backup(离线备份)。
温备份同样是在数据库运行中进行的,但是会对当前数据库的操作有所影响,备份时仅支持读操作,不支持写操作。
按照备份后文件的内容,热备份又可以分为:
在 MySQL 数据库中,逻辑备份是指备份出的文件内容是可读的,一般是文本内容。内容一般是由一条条 SQL 语句,或者是表内实际数据组成。如 mysqldump 和 SELECT * INTO OUTFILE 的方法。这类方法的好处是可以观察导出文件的内容,一般适用于数据库的升级、迁移等工作。但其缺点是恢复的时间较长。
裸文件备份是指复制数据库的物理文件,既可以在数据库运行中进行复制(如 ibbackup、xtrabackup 这类工具),也可以在数据库停止运行时直接复制数据文件。这类备份的恢复时间往往比逻辑备份短很多。
按照备份数据库的内容来分,备份又可以分为:
完全备份是指对数据库进行一个完整的备份,即备份整个数据库,如果数据较多会占用较大的时间和空间。
部分备份是指备份部分数据库(例如,只备份一个表)。
部分备份又分为:
增量备份需要使用专业的备份工具。指的是在上次完全备份的基础上,对更改的数据进行备份。也就是说每次备份只会备份自上次备份之后到备份时间之内产生的数据。因此每次备份都比差异备份节约空间,但是恢复数据麻烦。
差异备份指的是自上一次完全备份以来变化的数据。和增量备份相比,浪费空间,但恢复数据比增量备份简单。
MySQL 中进行不同方式的备份还要考虑存储引擎是否支持,如 MyISAM 不支持热备,支持温备和冷备。而 InnoDB 支持热备、温备和冷备。
一般情况下,我们需要备份的数据分为以下几种:
下面是几种常用的备份工具:
冷备份的优点如下:
冷备份的缺点如下:
冷备的备份与恢复过程也很简单。仅仅需要如下几步:
为了保证所备份数据的完整性,在停止 MySQL 数据库服务器之前,需要先执行 FLUSH TABLES 语句将所有数据写入到数据文件的文本文件里。
2)停掉 MySQL 服务,命令(2种方式)如下:
3)备份过程就是复制整个数据目录到远程备份机或者本地磁盘上,Linux 和 Windows 命令如下:
备份到本次磁盘也可以手动复制上述相关目录里的数据文件。
4)恢复过程就更简单了,仅仅需要把已备份的数据目录替换原有的目录就可以了,最后重启 MySQL 服务。
与冷备份正好相反,热备份是在数据库处于运行状态时直接备份,不影响现有业务的正常进行。热备份又细分为逻辑备份和裸文件备份,下面我们介绍逻辑备份和冷备份以及它们常用的备份和恢复的方法。
逻辑备份的最大优点就是对于各种存储引擎,都可以用同样的方法来备份。而冷备份则不同,不同的存储引擎的备份方法也各不相同。因此,对于不同存储引擎混合的数据库,用逻辑备份会更简单一些。
逻辑备份可以说是最简单,也是目前中小型系统最常用的备份方法。逻辑备份主要有以下几种方法:
mysqldump 是 MySQL 自带的逻辑备份工具。它的备份原理是通过协议连接到 MySQL 数据库,将需要备份的数据查询出来,然后将查询出的数据转换成对应的 INSERT 语句。当我们需要还原恢复这些数据时,只要执行这些 INSERT 语句,就能将对应的数据还原。所以有的资料也将这种备份方式称为 INSERT 备份。
恢复数据时可以使用 mysql -uroot -p < backup.sql 直接调用备份文件执行所有命令,将数据完全恢复到备份时候的状态。如果已经连接上了 MySQL 服务器,那么可以通过 source /path/backup.sql 来进行恢复。
SELECT INTO…OUTFILE 语句可以把表数据导出到一个文本文件中,且能将数据库中的表数据以特定分隔符进行分隔后记录在文本文件中,以达到逻辑备份的效果。
这种备份方式与 mysqldump 方法相比,使用的存储空间更小,数据格式更加清晰明确,编辑方便。但是这种方法只能导出或导入数据的内容,不包括表的结构,如果表的结构文件损坏,则必须先恢复原来的表的结构。而且这种方法不能在同一个备份文件中存在多个表的备份数据,增加了文件维护和恢复的成本。
这种备份方法恢复起来会稍微麻烦一点,需要一个表一个表通过相关命令来进行恢复。当然如果是通过脚本来实现自动多表恢复也是比较方便的。恢复方法有 2 个,一个是通过 MySQL 的 LOAD DATA INFILE 命令来恢复数据,另一种方法就是通过 MySQL 提供的使用工具 mysqlimport 来进行恢复。
mydumper 是针对 MySQL 数据库备份的一个轻量级第三方的开源工具,备份方式为逻辑备份。它支持多线程,备份速度远高于原生态的 mysqldump 以及其它众多优异特性。与其配套的相应恢复数据为 myloader 工具。DBA 称 mydumper 和 myloader 为备份界的“小钢炮”。
我们可以看出所谓的逻辑备份就是备份 SQL 语句,然后恢复数据时执行备份 SQL,从而实现数据库数据的重现。逻辑备份完成后所形成的文件都可以直接编辑。
逻辑备份的作用如下:
裸文件备份主要在底层复制数据文件,所以备份速度要比逻辑备份更快。
它的优点就是备份与恢复过程的速度很快,安全可靠,而且在备份过程中不会缩表,不影响现有业务。但它目前还是不能对表结构文件和其它非事务类型的表进行备份。
这里介绍如何使用 mysqldump 命令备份数据库。
mysqldump 命令执行时,可以将数据库中的数据备份成一个文本文件。数据表的结构和数据将存储在生成的文本文件中。
使用 mysqldump 命令备份一个数据库的语法格式如下:
mysqldump -u username -p dbname [tbname ...]> filename.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 语句向表中插入记录。
如果要使用 mysqldump 命令备份多个数据库,需要使用 --databases 参数。备份多个数据库的语法格式如下:
mysqldump -u username -p --databases dbname1 dbname2 ... > filename.sql
我们把所有的db数据库都进行备份
这是在当前目录下进行的备份,备份之后,目录里面出现了allback.sql的文件,查看一下内容
mysqldump 命令备份所有数据库的语法格式如下:
mysqldump -u username -p --all-databases>filename.sql
使用“--all-databases”参数时,不需要指定数据库名称
在 MySQL 中,可以使用 mysql 命令来恢复备份的数据。mysql 命令可以执行备份文件中的 CREATE 语句和 INSERT 语句,也就是说,mysql 命令可以通过 CREATE 语句来创建数据库和表,通过 INSERT 语句来插入备份的数据。
mysql 命令语法格式如下:
mysql -u username -p [dbname] < filename.sql
其中:
source 数据库备份存储的文件路径
一口气恢复了四个数据库。
使用show processlist即可查看当前连接MySQL的用户。比如:
show processlist可以告诉我们当前有哪些用户连接到我们的MySQL,如果查出某个用户不是你正常登录的,那么很有可能你的数据库被人入侵了,以后如果发现自己的数据库比较慢时,可以用这个SQL来查看数据库连接情况。