【1】管理事务处理 【1.1】事务处理 1)并非所有引擎都支持事务管理,MyISAM 不支持,而InnoDB支持; 2)事务处理:可以用来维护数据库的完整性,它保证成批的MySQL 操作要么完全执行,要么完全不执行; 3)事务处理是一种机制:用来管理必须成批执行的MySQL 操作,以保证数据库不包含不完整的操作结果。利用事务处理,可以保证一组操作不会中途停止,他们或者作为整体执行,或者完全不执行。如果没有发生错误,则整组语句提交给数据库表;若发生了错误,则进行回退以恢复数据库到某个已知且安全的状态; 4)关于事务处理需要知道的几个术语(terms):
t1)事务(transaction):指一组SQL 语句; t2)回退(rollback):指撤销指定的SQL语句的过程; t3)提交(commit):指将未存储的SQL语句结果写入到数据库表; t4)保留点(savepoint):指事务处理中设置的临时占位符,你可以对它发布回退;
【1.2】控制事务处理 1)管理事务处理的关键在于 将SQL 语句组分解为逻辑块,并明确规定数据何时应该回退,何时不应该回退 ; 2)标识事务的开始: start transacation:
【1.2.1】使用rollback 1)rollback用于回退or撤销事务; 2)rollback只能在一个事务处理内使用,在执行一条 start transaction 命令之后使用; Attention)
A1)事务处理用来管理 insert,update 和 delete 语句; A2)你不能回退 select语句,create 或 drop 操作;【1.2.2】使用commit 1)隐含提交:一般的mysql语句都是直接针对数据库表执行和编写的,这就是所谓的隐含提交,即提交(写或保存)操作是自动进行的; 2)但是在事务处理块中,提交不会隐含地进行。为进行明确的提交,使用commit语句,如下所示:
start transaction;3)隐含事务关闭:当commit 或 rollback 语句执行后,事务会自动关闭;
delete from product where id=1;
delete from product where id=1;
commit;
【1.2.3】使用保留点 1)intro to 保留点:为了支持回退部分事务处理 ,必须能在事务处理块中合适的位置放置占位符,这些占位符就称为 保留点; 2)创建占位符:使用 savepoint p1; 3)看个荔枝
3.1)创建保留点: savepoint delete1; 3.2)回退到本例给出的保留点:rollback to delete1;Attention)保留点在事务处理完(执行一条rollbaack 或 commit)后自动释放,也可以用 release savepoint 明确地释放保留点;
【1.2.4】更改默认的提交行为 1)默认的MySQL行为是自动提交所有更改,换句话说,任何时候你执行一条MySQL 语句,该语句实际上都是针对表执行的,而且所做的更改立即生效; 2)为指示MySQL 不自动提交更改,需要使用 set autocommit=0;(干货——为指示MySQL 不自动提交更改,需要使用 set autocommit=0) 3) autocommit 标志决定是否自动提交更改,不管有没有commit; Attention)autocommit 标志是针对每个连接而不是服务器的; (干货——autocommit 标志是针对每个连接而不是服务器的)
【2】全球化和本地化 【2.1】字符集和校对顺序 1)在讨论多种语言和字符集时,将遇到以下重要术语(terms)
t1)字符集:为字母和符号的集合; t2)编码:为某个字符集成员的内部表示; t3)校对:为规定字符如何比较的指令;2)排序为什么重要? 排序因为不是外界想象的那么容易。考虑 词APE, apex 和 Apple。他们处于正确的排序顺序吗? 这有赖于你是否想区分大小写。使用区分大小的校对顺序有一种排序方式,不使用区分大小写的校对顺序有其他的排序方式;这不仅仅影响排序,还影响搜索; Attention)使用何种字符集和校对的决定在 数据库,数据库和表级进行;
【2.2】使用字符集和校对顺序 1)查看字符集完整列表(show character set)
2)查看所支持校对的完整列表(show collation)
对上述列表的分析(Analysis):
A1)此语句显示所有可用的校对,以及它们使用的字符集; A2)许多校对会出现两次,一次区分大小写(_cs表示),一次不区分大小写(_ci 表示);3)为了确定所用的字符集和校对,使用如下语句:
4)给表指定字符集和校对,使用带子句的 create table:
5)给列指定字符集和校对:
6)校对在对用order by 子句检索出来的数据排序时其重要作用。 看个荔枝)在 orde by子句中设置校对策略(t114)
7)查看client,connection,database,filesystem等的字符集和校对;
【3】安全管理 【3.1】访问控制 1)MySQL 服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权; 2)访问控制:管理员需要给用户提供他们所需的访问权,这就是所谓的访问控制,管理访问控制需要创建和管理用户账号; 3)不要使用root:应该严肃对待 root登录的使用。仅在绝对需要时使用它。不应该在日常的MySQL 操作中使用 root; 【3.2】管理用户 1)MySQL用户账号和信息存储在 名为mysql 的MySQL 数据库表中(mysql数据库中有一个名为user的表,它包含所有账号);
【3.2.1】创建用户账号 1)创建命令:create user new_root identified by 'new_root'; 2)指定散列口令:identified by 指定的口令为 纯文本,MySQL 将在保存到user表之前对其进行加密。为了作为散列值指定口令,使用 identified by password; 3)重命名用户账号:rename user new_root to new_root_copy;
【3.2.2】删除用户账号
【3.2.3】设置访问权限 1)在创建用户后,必须接着分配访问权限。新创建的用户没有访问权限,他们可以登录,但不能看到数据,不能执行任何数据库操作; 2)查看赋予账号的权限,使用 show grants for
对上图的分析(Analysis):
A1)第一行权限 usage on *.*:表示根本没有权限,所以此结果表示在任意数据库和任意表上对任何东西没有权限(第一行权限); A2)第二行权限 GRANT SELECT, INSERT ON `testcorejava`.* TO 'pacoson'@'localhost':表明对数据库 testcorejava下面的所有表有select 和insert的权限;Attention)用户定义为 user@host: MySQL的权限用户名和主机名结合定义。如果不指定主机名,则使用默认的主机名%; 3)设置权限,使用grant语句。grant要求至少给出如下 info:
info1)要授予的访问权限; info2)被授予访问权限的数据库或表; info3)用户名;3.1)看个授予权限的荔枝:
grant select on testcorejava.* to user_name ;
Attention)再次提醒,不管是 查看用户权限,还是设置用户权限,都需要加上 host,如 username@host; 4)撤销权限
5)grant 和 revoke 可以在几个层次上控制访问权限:
level1)整个服务器,使用 grant all 和 revoke all; level2)整个数据库,使用 on database.*; level3)特定的表,使用 on database.table; level4)特定的列; level5)特定的存储过程;5.1)下表列出了可以授予或撤销的每个权限:
【3.2.4】更改口令1)使用 set password语句;2)新口令加密如下:
3)用户登录mysql -upacoson -hlocalhost -p(干货——还是那句话,不要忘记host)
【4】数据库维护 1)MySQL备份数据的方法(methods)
method1)使用命令行实用程序 mysqldump 转储所有数据库内容到外部文件; method2)可用命令行实用程序 mysqlhotcopy 从一个数据库复制所有数据(并非所有数据库引擎都支持这个实用程序); method3)可以使用MySQL 的 backup table 或 select into outfile 转储所有数据到某个外部文件。这两条语句都接收将要创建的文件系统名,此系统文件必须不存在,否则会出错;Attention)首先刷新未写数据:为了保证所有数据被写到磁盘(包括索引数据),可能需要在进行备份前使用 flush tables 语句; 【4.2】进行数据库维护 1)analyze table:用来检查表键是否正确; 2)check table :用来针对许多问题对表进行检查; 【4.3】诊断启动问题 1)服务器启动问题通常在对 MySQL 配置或服务器本身进行更改时出现; 2)在排除系统启动问题时,首先应该尽量用手动启动服务器。MySQL 服务器自身通过在命令行上执行 mysqld 启动; 3)下面是mysqld 的几个重要options:
o1)-- help :显示帮助; o2)--safe-mode:装载减去某些最佳配置的服务器; o3)--verbose:显示全文本消息; o4) --version:显示version 信息 然后退出;
【4.4】 查看日志文件 1)MySQL主要的日志文件有以下几种(types):
type1)错误日志:它包含启动和关闭问题以及任意关键错误的细节。此日志通常名为 hostname.err。位于data目录中。次日志名可用 --log-error命令行选项进行修改; type2)查询日志:它记录所有MySQL活动,在诊断问题时非常有用。此日志文件可能会很快地变得非常大,因此不应该长期使用它。此日志通常命名为 hostname.log,位于 data目录中。可以通过 --log 目命令行选项进行修改; type3)二进制日志:它记录更新过数据(或者可能更新过数据)的所有语句。此日志通常命名为 hostname-bin,位于data目录内。。此名字可以用 --log-bin 命令行选项进行修改。 type4)缓慢查询日志:此日志记录执行缓慢的任何查询。这个日志在确定数据库何处需要优化很有用。此日志通常名为 hostname-slow.log,位于data目录中。可以用 --log-slow-queries 命令行进行修改;Attention)在使用日志时,可以用flush logs 命令来 刷新和重新开始所有日志文件;
【5】appendix-MySQL 数据类型1)数据类型有以下目的(targets):
t1)数据类型允许限制可存储在列中的数据;(如数值数据类型只能接受数值) t2)数据类型允许在内部更有效地存储数据。可以用一种比文本串更简洁的格式存储数值和日期时间值; t3)数据类型允许变换排序顺序。如果所有数据都作为串处理,那么 1 位于10之前,而10位于2之前。作为数值数据类型,数值才能正确排序;
【5.1】串数据类型1)最常用的数据类型是串数据类型。有两种串类型,分别是定长串 和 变长串;
1.1)定长串:定长串接收长度固定的字符串,其长度是在创建表时指定的,定长列不允许多于指定的字符数目; 1.2)变长串:变长串存储可变长度的文本;text属于变长串类型;2)既然 变长类型那么灵活,为什么还要使用定长类型呢? 回答是性能。MySQL 处理定长列远比处理变长列快的多。而且MySQL 不允许对变长列进行索引;
Attention)
A1)使用引号:不管使用何种形式的串数据类型,串值都必须括在引号内; A2)当数值不是数值类型时: 比如电话号码和邮政编码存储在数值字段中,但这是不可取的。如 邮政编码01234,则保存的将是数值1234,实际上丢失了一位数字;
【5.2】数值数据类型
Attention)
A1)有符号与无符号: 所有数值数据类型都可以有符号或无符号(除开bit 和 boolean);有符号数值列可以存储正或负的数据,无符号数值列只能存储正数。默认情况为有符号,如果需要,可以使用unsigned关键字,将使用无符号数据类型,这样将允许你存储两倍大小的值; A2)不使用引号; A3)存储货币数据类型:MySQL没有专门存储货币的数据类型,一般情况下使用 decimal(8,2);
【5.3】日期和时间数据类型
【5.4】二进制数据类型1)intro : 二进制数据类型可以存储任何数据(甚至包括二进制信息),如图像,多媒体,字处理文档等;