【python MySQL 笔记】MySQL高级 ( 视图、事务、索引、账户管理、主从)
目录
1. 视图
对于复杂的查询,往往是有多个数据表进行关联查询而得到,如果数据库因为需求等原因发生了改变,为了保证查询出来的数据与之前相同,则需要在多个地方进行修改,维护起来非常麻烦。解决办法:定义视图。
视图:
- 视图是一种虚拟的表,是对若干张基本表的引用,是从数据库中一个或者多个表中导出来的表。
- 数据库中只存放了视图的定义,而并没有存放视图中的数据,即不存储具体的数据,这些数据存放在原来的表中。(基本表数据发生了改变,视图也会跟着改变,更新数据应该在原表更新)
- 使用视图查询数据时,数据库系统会从原来的表中取出对应的数据
视图的作用:
- 使操作简便化 (方便查数据);
- 增加数据的安全性;
- 提高表的逻辑独立性,对数据库重构,也不影响程序的运行;
- 减少复杂的SQL语句,增加可读性
创建视图:
CREATE [ ALGORITHM ={ UNDEFIEND | MERGE | TEMPTABLE }] VIEW 视图名 [ ( 属性清单) ] AS SELECT 语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ];
- ALGORITHM 是可选参数,表示视图选择的算法;
- “视图名”参数表示要创建的视图的名称(建议以v_开头);
- “属性清单”是可选参数,其指定了视图中各种属性的名词,默认情况下与 SELECT 语句中查询的属性相同;
- SELECT 语句参数是一个完整的查询语句,标识从某个表查出某些满足条件的记录,将这些记录导入视图中;
- WITH CHECK OPTION 是可选参数,表示更新视图时要保证在该视图的权限范围之内;
ALGORITHM 包括 3 个选项 UNDEFINED、MERGE 和 TEMPTABLE。其中,
- UNDEFINED 选项表示 MySQL 将自动选择所要使用的算法;
- MERGE 选项表示将使用视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分;
- TEMPTABLE 选项表示将视图的结果存入临时表,然后使用临时表执行语句;
CASCADED是可选参数,表示更新视图时要满足所有相关视图和表的条件,该参数为默认值;LOCAL 表示更新视图时,要
满足该视图本身的定义条件即可;
最简单的创建视图如下:
create view 视图名称 as select语句;
注:
查看视图 :show tables;
使用视图:视图的用途就是查询,跟表查询一样
删除视图:drop view 视图名;
视图demo:
1. 以下复杂的SQL语句将三张表的信息都查了出来,可将这个查询结果当作一个虚拟的表,可以方便查询,这个虚拟的表就是视图。
select * from goods as g left join goods_cates as c on g.cate_id=c.id left join goods_brands as b on g.brand_id=b.id;
2. 将上面的语句优化以下,保留想要的查询字段即可。
select g.*, c.name as cate_name, b.name as brand_name
from goods as g left join goods_cates as c on g.cate_id=c.id left join goods_brands as b on g.brand_id=b.id;
3. 将刚刚的查询结果,作为一个虚拟的表,即视图。通过 show tables; 可以看到多了一张表(虚拟的)。
create view v_goods_info as
select g.*, c.name as cate_name, b.name as brand_name
from goods as g left join goods_cates as c on g.cate_id=c.id left join goods_brands as b on g.brand_id=b.id;
4. 通过视图可以当作一个表来查询。
select * from v_goods_info;
注:
- 视图主要为了放标查询
- 基本表数据发生了改变,视图也会跟着改变
- 通过视图更新数据 会失败
2. 事务
所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。事务广泛的运用于订单系统、银行系统等多种场景。
例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。所以,应该把他们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。
(重点:事务概念、作用、4大特性)
2.1. 事务四大特性(简称ACID)
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
以下内容出自《高性能MySQL》第三版,了解事务的ACID及四种隔离级有助于我们更好的理解事务运作。
下面举一个银行应用是解释事务必要性的一个经典例子。假如一个银行的数据库有两张表:支票表(checking)和储蓄表(savings)。现在要从用户Jane的支票账户转移200美元到她的储蓄账户,那么至少需要三个步骤:
- 检查支票账户的余额高于或者等于200美元。
- 从支票账户余额中减去200美元。
- 在储蓄帐户余额中增加200美元。
上述三个步骤的操作必须打包在一个事务中,任何一个步骤失败,则必须回滚所有的步骤。
可以用START TRANSACTION语句开始一个事务,然后要么使用COMMIT提交将修改的数据持久保存,要么使用ROLLBACK撤销所有的修改。事务SQL的样本如下:
- start transaction;
- select balance from checking where customer_id = 10233276;
- update checking set balance = balance - 200.00 where customer_id = 10233276;
- update savings set balance = balance + 200.00 where customer_id = 10233276;
- commit;
一个很好的事务处理系统,必须具备这些标准特性:
- 原子性(atomicity)
一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性
- 一致性(consistency)
数据库总是从一个一致性的状态转换到另一个一致性的状态。(在前面的例子中,一致性确保了,即使在执行第三、四条语句之间时系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。)
- 隔离性(isolation)
通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。(在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另外的一个账户汇总程序开始运行,则其看到支票帐户的余额并没有被减去200美元。)
注:即在最终提交前一个SQL语句的执行对另一个客户的SQL语句的执行是隔离的。可类比多线程的互斥锁。
- 持久性(durability)
一旦事务提交,则其所做的修改会永久保存到数据库。(此时即使系统崩溃,修改的数据也不会丢失。)
注:
- 用python操作mysql时,默认了开启事务,需要手动添加执行commit。
- 命令号MySQL客户端执行SQL语句时,默认每个SQL语句是一个事务,只要按下回车就会自动执行commit 。想要多个SQL语句一起执行时,可通过手动开启事务,处理数据,再commit。
2.2. 事务命令
表的引擎类型必须是innodb类型才可以使用事务,这是mysql表的默认引擎。选择数据库后,查看表的创建语句,可以看到engine=innodb。
-- 查看goods表
show create table goods;
-- 部分查询结果如下,可以看到ENGINE=InnoDB
| goods | CREATE TABLE `goods` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(150) NOT NULL,
`cate_id` int(10) unsigned NOT NULL,
`brand_id` int(10) unsigned NOT NULL,
`price` decimal(10,3) NOT NULL DEFAULT '0.000',
`is_show` bit(1) NOT NULL DEFAULT b'1',
`is_saleoff` bit(1) NOT NULL DEFAULT b'0',
PRIMARY KEY (`id`),
KEY `cate_id` (`cate_id`),
KEY `brand_id` (`brand_id`),
CONSTRAINT `goods_ibfk_1` FOREIGN KEY (`cate_id`) REFERENCES `goods_cates` (`id`),
CONSTRAINT `goods_ibfk_2` FOREIGN KEY (`brand_id`) REFERENCES `goods_brands` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8 |
开启事务:开启事务后执行修改命令,变更会维护到本地缓存中,而不维护到物理表中。
begin;
或者
start transaction;
提交事务:将缓存中的数据变更维护到物理表中。
commit;
回滚事务:放弃缓存中变更的数据
rollback;
2.3. 演示
为了演示效果,需要打开两个终端窗口,使用同一个数据库,操作同一张表。
注意对比两个终端的查询结果,理解事务。
数据准备
创建一个表:
-- 创建表
create table money (
id int unsigned not null primary key auto_increment,
num int unsigned not null );
-- 插入数据 (模拟3个人的帐号)
insert into money value (0,100),(0,200),(0,0);
-- 查看表的数据
select * from money;
+----+-----+
| id | num |
+----+-----+
| 1 | 100 |
| 2 | 200 |
| 3 | 0 |
+----+-----+
模拟转账,将1的100块转给2.(1减100,2加100)
step1:
终端1:开启事务,更新数据(给1减100);此时在终端1查询发现数据发生了变化
begin;
update money set num=num-100 where id=1;
-- 查看结果,发现数据发生了变化
select * from money;
+----+-----+
| id | num |
+----+-----+
| 1 | 0 |
| 2 | 200 |
| 3 | 0 |
+----+-----+
step2:
终端2:查询数据,此时数据没发生变化。(因为终端1 的事务没有提交执行commit)
select * from money;
+----+-----+
| id | num |
+----+-----+
| 1 | 100 |
| 2 | 200 |
| 3 | 0 |
+----+-----+
step3:
终端2:开启事务,更新数据(给3加100),此时在终端2查询发现数据发生了变化;
begin;
update money set num=num+100 where id=3;
select * from money;
+----+-----+
| id | num |
+----+-----+
| 1 | 100 |
| 2 | 200 |
| 3 | 100 |
+----+-----+
step4:
终端1:更新数据(给2加100),此时在终端1查询发现数据发生了变化,执行commit; 。
update money set num=num+100 where id=2;
select * from money;
+----+-----+
| id | num |
+----+-----+
| 1 | 0 |
| 2 | 300 |
| 3 | 0 |
+----+-----+
commit;
step5:
终端2:更新数据(给1减100),会提示错误,因为终端1执行了commit,实际上1(unsigned 类型)变成了0,不能再减了。
update money set num=num-100 where id=1;
-- 会提示错误:... BIGINT UNSIGNED value is out of range in...
终端2:回滚
rollback;
select * from money;
+----+-----+
| id | num |
+----+-----+
| 1 | 0 |
| 2 | 300 |
| 3 | 0 |
+----+-----+
事务开启之后,对字段操作之后。在事务外,另一个用户再对同一个记录的同一个字段操作,会失败。
3. 索引
当数据库中数据量很大时,查找数据会变得很慢。这是可以通过 索引 来进行优化。(类似在图书馆通过索引来查找图书)
3.1. 索引知识点
索引:
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针,由数据库表中一列或者多列组合而成。
更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。
索引目的:
索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql。如果没有索引,那么你可能需要把所有单词看一遍(遍历)才能找到你想要的。
索引原理:
通俗的说,就是通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是我们总是通过同一种查找方式来锁定数据。但在数据库中实现显然要复杂的多,面临着等值查询,还有范围查询(>、<、between、in)、模糊查询(like)、并集查询(or)等。musql通过类似B-Tree的数据结构来解决。
索引的优缺点:
优点:提高查询数据的速度;
缺点:创建和维护索引的时间增加了;
索引分类:
- 普通索引:这类索引可以创建在任何数据类型中;
- 唯一性索引:使用 UNIQUE 参数可以设置,在创建唯一性索引时,限制该索引的值必须是唯一的;
- 全文索引:使用 FULLTEXT 参数可以设置,全文索引只能创建在 CHAR,VARCHAR,TEXT 类型的字段上。主要作用就是提高查询较大字符串类型的速度;只有 MyISAM 引擎支持该索引,Mysql 默认引擎不支持;
- 单列索引:在表中可以给单个字段创建索引,单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引;
- 多列索引:多列索引是在表的多个字段上创建一个索引;
- 空间索引:使用 SPATIAL 参数可以设置空间索引。空间索引只能建立在空间数据类型上,这样可以提高系统获取空间数据的效率;只有 MyISAM 引擎支持该索引,Mysql 默认引擎不支持;
创建索引方法:
注:
- 如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致
- 字段类型如果不是字符串,可以不填写长度部分
- 在创建表的时候创建索引,关键字 index:
CREATE TABLE 表名 (属性名 数据类型 [完整性约束条件], 属性名 数据类型 [完整性约束条件], .... 属性名 数据类型 [UNIQUE | FULLTEXT | SPATIAL ] INDEX| KEY [别名] (属性名 1 [(长度)] [ASC | DESC]) );
- 在已经存在的表创建索引:
CREATE [ UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 ON 表名 (属性名 [(长度)] [ ASC | DESC]);
通常这样创建即可:create index 索引名称 on 表名(字段名称(长度)) (建立索引“索引名称”,关联“表名”的“字段名称”)
- 用 ALTER TABLE 语句来创建索引:
ALTER TABLE 表名 ADD [ UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 (属性名 [(长度)] [ ASC | DESC])
查看索引:
show index from 表名;
删除索引:
drop index 索引名 on 表名;
DROP INDEX 索引名 ON 表名;
注:当数据表建立主键和外键时,会自动创建相应的索引。通过主键和外键查询时,效率也高。
3.2. 索引demo
1. 创建测试表test_index:
-- 创建一个表,有一个字段(属性)
create table test_index(title varchar(10));
2. 使用python程序通过pymsql模块 向表中插入十万条数据:
from pymysql import connect
def main():
# 创建Connection连接
conn = connect(host='localhost',port=3306,database='jing_dong',user='root',password='mysql',charset='utf8')
# 获得Cursor对象
cursor = conn.cursor()
# 插入10万次数据
for i in range(100000):
cursor.execute("insert into test_index values('ha-%d')" % i)
# 提交数据
conn.commit()
if __name__ == "__main__":
main()
3. 查询:
执行py程序后,执行SQL语句
-- 查看有多少数据
select count(*) from test_index;
+----------+
| count(*) |
+----------+
| 100000 |
+----------+
-- 查询所有数据
select * from test_index;
以上查询无法体现查询时间,可开启运行时间监测:
-- 开启运行时间监测(可统计时间)
set profiling=1;
-- 查找第1万条数据ha-99999
select * from test_index where title='ha-99999';
-- 查看执行的时间:
show profiles;
+----------+------------+-------------------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+-------------------------------------------------+
| 1 | 0.08867650 | select * from test_index where title='ha-99999' |
+----------+------------+-------------------------------------------------+
-- 为表title_index的title列创建索引:
create index title_index on test_index(title(10));
-- 执行查询语句:
select * from test_index where title='ha-99999';
-- 再次查看执行的时间,可见执行时间减少了,效率大大提升
show profiles;
+----------+------------+---------------------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+---------------------------------------------------+
| 1 | 0.08867650 | select * from test_index where title='ha-99999' |
| 2 | 0.34765000 | create index title_index on test_index(title(10)) |
| 3 | 0.00044275 | select * from test_index where title='ha-99999' |
+----------+------------+---------------------------------------------------+
注意
- 建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件;
- 对于频繁更新和插入的表格,没必要为一个很少使用的where字句单独建立索引;
- 对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引;
- 建立索引会占用磁盘空间
- 对于常用且数据多的列(字段),才推荐创建索引
4. 账户管理(了解)
根据账户权限的不同,MySQL的账户可分为:
- 服务实例级账号:,启动了一个mysqld,即为一个数据库实例;如果某用户如root,拥有服务实例级分配的权限,那么该账号就可以删除所有的数据库、连同这些库中的表;进行账户操作时,需要使用root账户登录,这个账户拥有最高的实例级权限。
- 数据库级别账号:对特定数据库执行增删改查的所有操作,这是最常用的账户级别;
- 数据表级别账号:对特定表执行增删改查等所有操作;
- 字段级别的权限:对某些表的特定字段进行操作;
- 存储程序级别的账号:对存储程序进行增删改查的操作。
账户的操作主要包括创建账户、删除账户、修改密码、授权权限等。
4.1. 授予权限
授予权限的操作需要使用实例级账户登录,以下以root为例。
主要操作包括:
- 查看所有用户
- 修改密码
- 删除用户
注:mysql有一个名为mysql的数据库,该数据库中包含一个名为user的table,存储所有用户及权限信息。
4.1.1. 查看所有用户
- 所有用户及权限信息存储在mysql数据库的user表中
- 查看user表的结构
-- 先使用mysql数据库
use mysql;
-- 查看user表结构
desc user;
查看表结构可以看到user有很多字段;主要字段如下:
主要字段说明:
- Host表示允许访问的主机
- User表示用户名
- authentication_string表示密码,为加密后的值
查看所有用户的上面三个字段:
select host,user,authentication_string from user;
+-----------+------------------+-------------------------------------------+
| host | user | authentication_string |
+-----------+------------------+-------------------------------------------+
| localhost | root | *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA |
| localhost | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | debian-sys-maint | *EFED9C764966EDB33BB7318E1CBD122C0DFE4827 |
+-----------+------------------+-------------------------------------------+
host为localhost 表示只能本地登录,为 % 表示可以任意一台电脑登录。
4.1.2. 创建账户并授权
- 需要使用实例级账户登录后操作,以root为例;
- 常用权限主要包括:create、alter、drop、insert、update、delete、select;
- 如果分配所有权限,可以使用all privileges。
创建账户&授权 语法:
grant 权限列表 on 数据库 to '用户名'@'访问主机' identified by '密码';
demo1:
需求:
创建一个 laowang 账号,密码为 123456 ,只能通过本地访问, 并且只能对
jing_dong
数据库中的所有表进行 读(select)操作。step1:使用root登录
mysql -uroot -p -- 回车后写密码,然后回车
step2:创建账户并授予所有权限
grant select on jing_dong.* to 'laowang'@'localhost' identified by '123456'; -- 再执行以下,发现多了一个laowang账户 select host,user,authentication_string from user;
说明:
- 可以操作python数据库的所有表,方式为:
jing_dong.*
- 访问主机通常使用 百分号% 表示此账户可以使用任何ip的主机登录访问此数据库
- 访问主机可以设置成 localhost或具体的ip,表示只允许本机或特定主机访问
查看用户有哪些权限
show grants for laowang@localhost; +--------------------------------------------------------+ | Grants for laowang@localhost | +--------------------------------------------------------+ | GRANT USAGE ON *.* TO 'laowang'@'localhost' | | GRANT SELECT ON `jing_dong`.* TO 'laowang'@'localhost' | +--------------------------------------------------------+
step3:退出root的登录
quit
此时,可以使用laowang账户登录,其可以对jing_dong数据库执行 读操作。
demo2:
创建一个
laoli
的账号,密码为12345678
,可以 任意电脑 进行链接 访问, 并且对jing_dong
数据库中的所有表拥有 所有权限。grant all privileges on jing_dong.* to "laoli"@"%" identified by "12345678";
退出root账户后,可以使用 laoli 账户登录,其可以对 jing_dong 数据库执行所有操作。
4.2. 账户操作
4.2.1. 修改权限
grant 权限名称 on 数据库 to 账户@主机 with grant option;
step1:修改权限demo:
登录root账户
mysql -uroot -p
-- 回车后写密码,然后回车
step2:修改权限,并刷新
-- grant 权限名称 on 数据库 to 账户@主机 with grant option;
grant select, insert on jing_dong.* to laowang@localhost with grant option;
-- 刷新权限使其生效
flush privileges;
-- 查看权限
show grants for laowang@localhost;
+----------------------------------------------------------------------------------+
| Grants for laowang@localhost |
+----------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'laowang'@'localhost' |
| GRANT SELECT, INSERT ON `jing_dong`.* TO 'laowang'@'localhost' WITH GRANT OPTION |
+----------------------------------------------------------------------------------+
4.2.2. 修改密码
- step1:使用root登录,修改mysql数据库的user表数据
-
step2:使用password()函数进行密码修改
update user set authentication_string=password('新密码') where user='用户名'; 例: update user set authentication_string=password('123') where user='laowang';
-
step3:修改后需要刷新权限
-- 刷新权限: flush privileges
4.2.3. 远程登录(危险慎用)
如果想在一个Ubuntu中使用msyql命令远程连接另外一台mysql服务器的话,通过以下方式即可完成。
修改 /etc/mysql/mysql.conf.d/mysqld.cnf 文件
vim /etc/mysql/mysql.conf.d/mysqld.cnf
......略
注:
- 开启远程登录mysql服务器的功能是极其不安全的
- 对远程操作有需求时,推荐使用 SSH 远程登录 Linux 服务器,再对mysql进行操作
4.2.4. 删除账户
- 法1:使用root登录
drop user '用户名'@'主机';
例:
drop user 'laowang'@'%';
- 法2:使用root登录,删除mysql数据库的user表中数据
delete from user where user='用户名';
例:
delete from user where user='laowang';
-- 操作结束之后需要刷新权限
flush privileges
5. 主从
为了提高数据库的性能(读写分离、负载均衡等) 或者 提高数据安全性进行数据备份等,可以使用主从服务器。一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。
5.1. 主从同步定义
主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。(注:可以通过事件等触发复制操作)
使用主从同步的好处:
- 通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整整个数据库的性能。
- 提高数据安全,因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据
- 在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能
5.2. 主从同步的机制
- Mysql服务器之间的主从同步是基于二进制日志机制,主服务器使用二进制日志来记录数据库的变动情况,从服务器通过读取和执行该日志文件来保持和主服务器的数据一致。
- 在使用二进制日志时,主服务器的所有操作都会被记录下来,然后从服务器会接收到该日志的一个副本。从服务器可以指定执行该日志中的哪一类事件(譬如只插入数据或者只更新数据),默认会执行日志中的所有语句。
- 每一个从服务器会记录关于二进制日志的信息:文件名和已经处理过的语句,这样意味着不同的从服务器可以分别执行同一个二进制日志的不同部分,并且从服务器可以随时连接或者中断和服务器的连接。
- 主服务器和每一个从服务器都必须配置一个唯一的ID号(在my.cnf文件的[mysqld]模块下有一个server-id配置项),另外,每一个从服务器还需要通过CHANGE MASTER TO语句来配置它要连接的主服务器的ip地址,日志文件名称和该日志里面的位置(这些信息存储在主服务器的数据库里)
5.3. 配置主从同步的基本步骤
有很多种配置主从同步的方法,可以总结为如下的步骤:
- 在主服务器上,必须开启二进制日志机制和配置一个独立的ID
- 在每一个从服务器上,配置一个唯一的ID,创建一个用来专门复制主服务器数据的账号
- 在开始复制进程前,在主服务器上记录二进制文件的位置信息
- 如果在开始复制之前,数据库中已经有数据,就必须先创建一个数据快照(可以使用mysqldump导出数据库,或者直接复制数据文件)
- 配置从服务器要连接的主服务器的IP地址和登陆授权,二进制日志文件名和位置
即:1.配置好二进制文件、2.主从服务器配置唯一id、3.配置从服务器从哪获取什么文件。
5.4. 详细配置主从同步的方法(待续)
--------end----------