Xinu's Note - mysql
type: channel
link: https://xbug.top/index.php/tag/mysql/
items: 高性能索引
items: mysql学习笔记二-索引、锁
items: mysql学习笔记一-redolog、事务隔离
items: windows环境下安装mysql服务
items: Mysql忘记root密码解决办法
items: Mysql权限管理控制及安全相关
items: 实用SQL语句，简化程序逻辑
items: MySQL存储引擎 MyISAM 与 InnoDB
items: mysql优化之主从复制与读写分离部署

高性能索引
type: item
date: 2020-04-11T19:38:13+08:00
description: 高性能索引B-Tree索引的限制create table peoples ( last_name varchar(50) not null, first_name varchar(50) not null, dob date not null, gender enum('f','m') not null, key(last_name, first_name, dob) );如果不是按照索引的最左列开始查找，则无法使用索引不能跳过索引中的列如果查询中有某个列的范围查询，则其右边的列都无法使用索引查询一句话，B-Tree索引顺序很重要！哈希索引的限制哈希索引只包含哈希值和行指针，不存储字段值，所以不能使用索引避免读取行哈希索引数据并不是按照索引值顺序存储的，所以也就无法用于排序哈希索引不支持部分索引列匹配查找哈希索引只支持等值查询 =, in(),<=>,不支持任何范围查询前缀索引计算方式select count(distinct left(idcard, 5)) / count(*); select count(distinct left(idcard, 6)) / count(*);复合索引顺序选择当不需要考虑排序和分组时，将选择性最高的列放在最前面通常是很好的高效索引案例延迟关联-- 存在索引 key(age, name); select * from peoples where age=20 and `name` like '%张三%'; select * from peoples t1 join (select id from peoples where age=20 and `name` like '%张三%') t2 on t1.id=t2.id; -- 第二种方式使用了覆盖索引此方式效率的提高取决于where条件返回的行数，不见得一定会提高效率，要具体分析索引在where与order中的使用create index idx on table1 (c1, c2, c3, c4); # 满足最左前缀原则，且排序的列索引顺序必须一致，排序方向必须一致，不能同时存在asc和desc，查询条件只要存在范围查询，则右面的索引全部失效 # 排序正常使用了索引 select id from table1 order by c1, c2, c3, c4; select id from table1 where c1 = 1 and c2 = 2 order by c3, c4; select id from table1 where c2 = 2 and c1 = 1 order by c3, c4; select id from table1 where c1 = 1 and c2 = 2 order by c3 desc, c4 desc; select id from table1 where c1 = 1 and c2 = 2 order by c3; select id from table1 where c1 = 1 and c2 = 2 order by c3 desc; # 排序未使用索引 select id from table1 order by c2, c3; select id from table1 where c1 = 1 and c2 = 2 order by c3 asc , c4 desc; select id from table1 where c1 = 1 and c2 >= 2 order by c3; select id from table1 where c1 = 1 and c2 = 2 order by c4; select id from table1 where c2 = 2 order by c1;总结 排序使用索引的条件如果存在where条件，所有where条件必须等值查询，且满足最左前缀，顺序可互换排序列的顺序必须与列索引顺序完全一致，且排序方向一致(不可同时出现asc和desc)关联查询时，order by 子句的列必须全部为第一张表的，且满足1，2才能使用索引排序索引案例1. 考虑支持多种过滤条件，而不是随便创建符合条件的索引-- eg 存在如下索引 create index idx_sex_country_age on people(sex, country, age) -- 想查询住在China的20岁的人，需要创建索引 idx_country_age ? no, 可以绕过sex，使用idx_sex_country_age select * from people where sex in (0, 1) and country="China" and age = 20…

mysql学习笔记二-索引、锁
type: item
date: 2020-01-16T21:35:00+08:00
description: 第四讲 索引 (上)总结索引的作用：提高数据查询效率常见索引模型：哈希表、有序数组、搜索树哈希表：键 - 值(key - value)。哈希思路：把值放在数组里，用一个哈希函数把key换算成一个确定的位置，然后把value放在数组的这个位置哈希冲突的处理办法：链表哈希表适用场景：只有等值查询的场景有序数组：按顺序存储。查询用二分法就可以快速查询，时间复杂度是：O(log(N))有序数组查询效率高，更新效率低有序数组的适用场景：静态存储引擎。二叉搜索树：每个节点的左儿子小于父节点，父节点又小于右儿子二叉搜索树：查询时间复杂度O(log(N))，更新时间复杂度O(log(N))数据库存储大多不适用二叉树，因为树高过高，会适用N叉树InnoDB中的索引模型：B+Tree索引类型：主键索引、非主键索引主键索引的叶子节点存的是整行的数据(聚簇索引)，非主键索引的叶子节点内容是主键的值(二级索引)主键索引和普通索引的区别：主键索引只要搜索ID这个B+Tree即可拿到数据。普通索引先搜索索引拿到主键值，再到主键索引树搜索一次(回表)一个数据页满了，按照B+Tree算法，新增加一个数据页，叫做页分裂，会导致性能下降。空间利用率降低大概50%。当相邻的两个数据页利用率很低的时候会做数据页合并，合并的过程是分裂过程的逆过程。从性能和存储空间方面考量，自增主键往往是更合理的选择。没有主键的表，innodb会给默认创建一个Rowid做主键第五讲 索引(下)覆盖索引使用非主键索引查询时，不可避免的有回表操作，使用覆盖索引可取消回表操作，覆盖索引，即索引中的内容覆盖了查询的内容，不需要回表操作。 create table T ( ID int primary key, k int NOT NULL DEFAULT 0, s varchar(16) NOT NULL DEFAULT '', index k(k)) engine=InnoDB; insert into T values(100,1, 'aa'),(200,2,'bb'),(300,3,'cc'),(500,5,'ee'),(600,6,'ff'),(700,7,'gg'); select * from where k=2; -- 有回表操作 select ID from where k=2; -- 无回表操作由于覆盖索引可以减少树的搜索次数，显著提升查询性能，所以使用覆盖索引是一个常用的性能优化手段。最左前缀原则最左前缀可以是联合索引的最左 N 个字段，也可以是字符串索引的最左 M 个字符。CREATE TABLE `tuser` ( `id` int(11) NOT NULL, `id_card` varchar(32) DEFAULT NULL, `name` varchar(32) DEFAULT NULL, `age` int(11) DEFAULT NULL, `ismale` tinyint(1) DEFAULT NULL, PRIMARY KEY (`id`), KEY `id_card` (`id_card`), KEY `name_age` (`name`,`age`) ) ENGINE=InnoDB select * from `tuser` where name like '张%'; -- 该语句可使用索引name_age -- name_age 索引包含两个索引 (name, age) 和 (name)建立联合索引时，评估索引复用性。字符串索引占用的空间要比整形索引大。二级索引可以看作是和主键索引的联合索引。索引下推select * from tuser where name like '张%' and age=10 and ismale=1; -- 以上查询语句可用到name索引在 MySQL 5.6 之前，只能先根据name索引找出符合条件的内容，然后到主键索引上找出数据行，再对比字段值。而 MySQL 5.6 引入的索引下推优化（index condition pushdown)， 可以在索引遍历过程中，对索引中包含的字段先做判断，直接过滤掉不满足条件的记录，减少回表次数。可以在索引中比较age，减少回表次数。第六讲 全局锁和表锁全局锁全局加读锁 FTWRL，整个数据库处于只读状态，一般用于不支持可重复读隔离级别的数据库整体备份，确保数据一致性。全局锁主要用在逻辑备份过程中。对于全部是 InnoDB 引擎的库，建议选择使用–single-transaction 参数，对应用会更友好。Flush tables with read lock;\ # 解锁 UNLOCK TABLES; # 第二种让数据库整体只读的方式 不推荐使用 set global readonl…

mysql学习笔记一-redolog、事务隔离
type: item
date: 2020-01-15T21:43:00+08:00
description: 第一讲 整体流程学习极客时间 《MySQL实战45讲》# 查看连接状态 show processlist;长连接内存占用大如何解决？定期断开长连接。使用一段时间，或者程序里面判断执行过一个占用内存的大查询后，断开连接，之后要查询再重连。如果你用的是 MySQL 5.7 或更新版本，可以在每次执行一个比较大的操作后，通过执行 mysql_reset_connection 来重新初始化连接资源。这个过程不需要重连和重新做权限验证，但是会将连接恢复到刚刚创建完时的状态。第二讲 redo log 与binlog更新操作的流程redo log物理日志 redo log 用于保证 crash-safe 能力binlog归档日志区别：redo log 是 InnoDB 引擎特有的；binlog 是 MySQL 的 Server 层实现的，所有引擎都可以使用。redo log 是物理日志，记录的是“在某个数据页上做了什么修改”；binlog 是逻辑日志，记录的是这个语句的原始逻辑，比如“给 ID=2 这一行的 c 字段加 1 ”。redo log 是循环写的，空间固定会用完；binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个，并不会覆盖以前的日志。参数设置：# 表示每次事务的 redo log 都直接持久化到磁盘。 innodb_flush_log_at_trx_commit=1 # 表示每次事务的 binlog 都持久化到磁盘。 sync_binlog=1第三讲 事务隔离事务的特性：原子性、一致性、隔离性、持久性多事务同时执行的时候，可能会出现的问题：脏读、不可重复读、幻读事务隔离级别：读未提交、读提交、可重复读、串行化READ-UNCOMMITTED READ-COMMITTED REPEATABLE-READ SERIALIZABLE 配置方法：启动参数 transaction_isolation事务隔离的实现：每条记录在更新的时候都会同时记录一条回滚操作。同一条记录在系统中可以存在多个版本，这就是数据库的多版本并发控制（MVCC）。回滚日志什么时候删除？系统会判断当没有事务需要用到这些回滚日志的时候，回滚日志会被删除。什么时候不需要了？当系统里么有比这个回滚日志更早的read-view的时候。为什么尽量不要使用长事务。长事务意味着系统里面会存在很老的事务视图，在这个事务提交之前，回滚记录都要保留，这会导致大量占用存储空间。除此之外，长事务还占用锁资源，可能会拖垮库。事务启动方式：显式启动事务语句，begin或者start transaction,提交commit，回滚rollback；set autocommit=0，该命令会把这个线程的自动提交关掉。这样只要执行一个select语句，事务就启动，并不会自动提交，直到主动执行commit或rollback或断开连接。建议使用方法一，如果考虑多一次交互问题，可以使用commit work and chain语法。在autocommit=1的情况下用begin显式启动事务，如果执行commit则提交事务。如果执行commit work and chain则提交事务并自动启动下一个事务。读取异常脏读，一个事务中读取到另一个事务未提交的数据。例如，事务 T1 读取到另一个事务 T2 未提交的数据，如果 T2 回滚，则 T1 相当于读取到了一个被认为不可能出现的值。不可重复读，在一个事务中，当重复读取同一条记录时，发现该记录的结果不同或者已经被删除了；如在事务 T1 中读取了一行，接着 T2 修改或者删除了该行 并提交，那么当 T1 尝试读取新的值时，就会发现改行的值已经修改或者被删除。幻读，通常是指在一个事务中，当重复查询一个结果集时，返回的两个不同的结果集，可能是由于另一个事务插入或者删除了一些记录。例如，事务 T1 读取一个结果集，T2 修改了该结果集中的部分记录 (例如插入一条记录)，T1 再次读取时发现与之前的结果不同 (多出来一条记录)，就像产生幻觉一样。在可重复读隔离级别下，普通查询是快照读，只有当前读情况下，才可能出现幻读这种情况！！幻读仅专指“新插入的行”，读取到行的更新不算幻读！！隔离级别与读现象隔离级别与读现象，性能依次下降。隔离级别脏读不可重复读取幻影数据行隔离表现READ UNCOMMITTEDYESYESYES别人改数据的事务尚未提交，我在我的事务中也能读到。READ COMMITTEDNOYESYES别人改数据的事务已经提交，我在我的事务中才能读到。REPEATABLE READNONOYES别人改数据的事务已经提交，我在我的事务中也不去读。SERIALIZABLENONONO我的事务尚未提交，别人就别想改数据。事务的启动…

windows环境下安装mysql服务
type: item
date: 2020-01-13T21:30:00+08:00
description: [TOC]windows环境下安装mysql服务下载https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.19-winx64.zip解压缩，进入 bin 目录安装、启动管理员权限启动 cmd 或者 windows powershell# 安装服务 mysqld install # 启动服务 net start mysql # Mysql服务无法启动，执行以下语句 mysqld --initialize --console net start mysql # 停止服务 net stop mysql修改默认密码set password for 'root'@'localhost'='123456';

Mysql忘记root密码解决办法
type: item
date: 2019-06-13T16:19:00+08:00
description: 忘记mysql的root用户密码的解决办法方法一 --skip-grant-tables首先，关闭实例这里，只能通过kill mysqld进程的方式。注意：不是mysqld_safe进程，也切忌使用kill -9。复制代码# ps -ef |grep mysqld root 6220 6171 0 08:14 pts/0 00:00:00 /bin/sh bin/mysqld_safe --defaults-file=my.cnf mysql 6347 6220 0 08:14 pts/0 00:00:01 /usr/local/mysql57/bin/mysqld --defaults-file=my.cnf --basedir=/usr/local/mysql57 --datadir=/usr/local/mysql57/data --plugin-dir=/usr/local/mysql57/lib/plugin --user=mysql --log-error=slowtech.err --pid-file=slowtech.pid --socket=/usr/local/mysql57/data/mysql.sock --port=3307 root 6418 6171 0 08:17 pts/0 00:00:00 grep --color=auto mysqld # kill 6347 使用--skip-grant-tables参数，重启实例# bin/mysqld_safe --defaults-file=my.cnf --skip-grant-tables --skip-networking & 设置了该参数，则实例在启动过程中会跳过权限表的加载，这就意味着任何用户都能登录进来，并进行任何操作，相当不安全。建议同时添加--skip-networking参数。其会让实例关闭监听端口，自然也就无法建立TCP连接，而只能通过本地socket进行连接。MySQL8.0就是这么做的，在设置了--skip-grant-tables参数的同时会自动开启--skip-networking。修改密码方法一 updateUSE mysql; UPDATE user SET password = PASSWORD('newpasswd') WHERE user = 'dbadmin' AND host = 'localhost'; FLUSH PRIVILEGES;注意：注意：MySQL 5.7.6版本以下，才能使用此方法来修改密码。从MySQL 5.7.6版本起，user表仅使用authentication_string列代替之前版本中的password列来存储密码。USE mysql; UPDATE user SET password = PASSWORD('newpasswd') WHERE user = 'dbadmin' AND host = 'localhost'; FLUSH PRIVILEGES;方法二 set passwordSET PASSWORD FOR 'dbadmin'@'localhost' = PASSWORD('newpasswd2');注意从MySQL 5.7.6版本开始，MySQL不推荐使用此语法，可能会在将来的版本中将其删除。作为一个代替的解决方案，它使用明文密码如下：SET PASSWORD FOR 'dbadmin'@'localhost' = 'newpasswd2';方法三 alter userALTER USER dbadmin@localhost IDENTIFIED BY 'newpasswd3';方法二 --init-file首先关闭实例创建sql文件,sql中的内容为修改密码的三种方式中的任意一种vim init.sql SET password for 'root'@'localhost'=password('123456');启动mysql服务 mysqld_safe --defaults-file=/etc/my.cnf --init-file=/opt/nginx/html/default/init.sql &实例启动成功，密码就修改完毕。

Mysql权限管理控制及安全相关
type: item
date: 2019-05-19T11:29:00+08:00
description: 授权操作详解授权五要素要授予的权限【权限列表中的内容】被授予访问权限的数据库或表【授权级别表中的内容】用户名地址【地址列表中的内容，mysql.user表中的host字段】密码【非必须】授权立即生效flush privileges; # 使用flush privileges;立即使权限生效，否则需要重启服务授权取消授权 语句grant 权限 on 授权范围 to username@'地址' [identified by '密码']; # 授权给账户root所有权限，允许任意地址连接，密码为123456 grant all on *.* to root@'%' identified by '123456'; # all privileges 中的 privileges 可省略 flush privileges; # 回收权限 revoke 权限 on 授权范围 from username@'地址'; # 回收root用户的查询权限 revoke select on *.* from root@'%'; flush privileges; 常用操作注意: 用户名@host 才是唯一用户查看账号root@'%'的权限 show grants for root@'%';删除用户root@'%' drop user 'root'@'%';用户改名、修改hostrename user root@'%' to admin@'localhost';修改用户root@'localhost'密码set password for root@'localhost' = password('123456');导出数据表内容select * into outfile '/tmp/outfile.txt' from loadtest; # 上面的语句只能将文件导出到mysql服务所在的主机上 mysql -h192.168.1.1 -uroot -p123456 -P3306 -e"select * from testdb.testtable;" > /tmp/loadtest.txt # 此方式可将数据导出到客户机上 授权指定列 grant select(id, username, password) on testdb.users to root@'localhost';授权存储过程 grant execute on procedure testdb.pr_add to root@'localhost'; 安全性相关删除任何无关的管理员用户和空密码的管理员用户,有需求再开删除test库(5.7没了),因为这个库默认是所有人都有权限读写,存在漏洞 drop database test;删除存放数据库的表信息。 delete from mysql.db;SSL加密设置,用途就是把数据加密,防止被截取后破解,5.6要加ssl指定文件位置配置,5.7自动开,然后执行命令就可以了.#执行命令,在数据目录创建key文件,下面这个命令是封装了整个创建过程,就不用做那么多复杂的事了 #不过这个命令文件是5.7新加入的,5.6中没有这个命令文件,但是可以放到在5.6上面用,还算方便. /usr/local/mysql/bin/mysql_ssl_rsa_setup --datadir=/data/mysql/data/ #然后看看开启了没有 mysql>SHOW VARIABLES LIKE 'have_ssl'; | have_ssl | YES | #进入mysql,授权ssl专用用户 mysql> grant all privileges on *.* to 'sslroot'@'%' identified by '123123' require ssl; #用ssl专用用户登录 mysql -usslroot -p'123123' -h127.0.0.1 #查看当前状态,SSL已启用 mysql> \s Current user: sslroot@127.0.0.1 SSL: Cipher in use is ECDHE-RSA-AES128-GCM-SHA256不过开启SSL需要谨慎,因为数据进行了加密处理,毫无疑问服务器需要消耗资源来校验密文,官方说明可能会下降25%的性能,还是比较高的.对于高并发的环境自然是性能下降明显,除非安全要求非常高,不然不建议开,一般来说只要授权限制访问IP是内网的就已经可以解决安全问题.权限相关参考内容权限列表权限关键字级别说明ALL PRIVILEGES所有授予所有权限CREATE数据库、表或索引创建数据库、表或索引权限DROP数据库或表删除数据库或表权限GRANT OPTION数据库、表或保存的程序赋予权限选项REFEREN…

实用SQL语句，简化程序逻辑
type: item
date: 2019-04-11T16:36:00+08:00
description: 在编写SQL时，灵活运用一些技巧，可以大大简化程序逻辑。插入或替换如果我们希望插入一条新记录（INSERT），但如果记录已经存在，就先删除原记录，再插入新记录。此时，可以使用REPLACE语句，这样就不必先查询，再决定是否先删除再插入：REPLACE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99);若id=1的记录不存在，REPLACE语句将插入新记录，否则，当前id=1的记录将被删除，然后再插入新记录。插入或更新如果我们希望插入一条新记录（INSERT），但如果记录已经存在，就更新该记录，此时，可以使用INSERT INTO ... ON DUPLICATE KEY UPDATE ...语句：INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99) ON DUPLICATE KEY UPDATE name='小明', gender='F', score=99;若id=1的记录不存在，INSERT语句将插入新记录，否则，当前id=1的记录将被更新，更新的字段由UPDATE指定。插入或忽略如果我们希望插入一条新记录（INSERT），但如果记录已经存在，就啥事也不干直接忽略，此时，可以使用INSERT IGNORE INTO ...语句：INSERT IGNORE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99);若id=1的记录不存在，INSERT语句将插入新记录，否则，不执行任何操作。快照如果想要对一个表进行快照，即复制一份当前表的数据到一个新表，可以结合CREATE TABLE和SELECT：-- 对class_id=1的记录进行快照，并存储为新表students_of_class1:CREATE TABLE students_of_class1 SELECT * FROM students WHERE class_id=1;新创建的表结构和SELECT使用的表结构完全一致。写入查询结果集如果查询结果集需要写入到表中，可以结合INSERT和SELECT，将SELECT语句的结果集直接插入到指定表中。例如，创建一个统计成绩的表statistics，记录各班的平均成绩：CREATE TABLE statistics ( id BIGINT NOT NULL AUTO_INCREMENT, class_id BIGINT NOT NULL, average DOUBLE NOT NULL, PRIMARY KEY (id) );然后，我们就可以用一条语句写入各班的平均成绩：INSERT INTO statistics (class_id, average) SELECT class_id, AVG(score) FROM students GROUP BY class_id;确保INSERT语句的列和SELECT语句的列能一一对应，就可以在statistics表中直接保存查询的结果：> select * from statistics; +----+----------+--------------+ | id | class_id | average | +----+----------+--------------+ | 1 | 1 | 86.5 | | 2 | 2 | 73.666666666 | | 3 | 3 | 88.333333333 | +----+----------+--------------+ 3 rows in set (0.00 sec)转载自：https://www.liaoxuefeng.com/wiki/001508284671805d39d23243d884b8b99f440bfae87b0f4000/001541118432466e6ee1a9fdd134026b281bf014f109264000

MySQL存储引擎 MyISAM 与 InnoDB
type: item
date: 2018-06-23T22:16:35+08:00
description: 基本比较总的来说，MyISAM和InnoDB各有优劣，各有各的使用环境。但是InnoDB的设计目标是处理大容量数据库系统，它的CPU利用率是其它基于磁盘的关系数据库引擎所不能比的。我觉得使用InnoDB可以应对更为复杂的情况，特别是对并发的处理要比MyISAM高效。同时结合memcache也可以缓存SELECT来减少SELECT查询，从而提高整体性能。

mysql优化之主从复制与读写分离部署
type: item
date: 2017-10-18T21:50:00+08:00
description: mysql优化之主从复制与读写分离部署1. ?读写分离与主从复制 如上图所示，当web server1/2/3要写入数据时，则向mysql db Master(主服务器）发出写入请求（即写入到master），如果要进入读操作时，则只向从服务器 mysql DB Slave1或2或3发出读取请求。如此将原本读写在同一台服务器的工作量分摊到了一台负责写入，N台负责读取（大部分的网站都是读取请求远大于写入请求），从而从一定程度时实现了负载均衡（如果有N台从服务器，则由主从代理系统自动分配某个具体请求从哪一个从服务器读取）。 读写分离是靠主从复制来实现的。即当一个数据写入到主服务器后，主服务器会将写入信息写入到binlog（二进制日志）里，同时同步（或异步或半同步）到从服务器里。从服务器根据主服务器传来的binlog，生成relay-log(中继日志），然后mysql服务器再用relay-log的信息将数据写入到数据库。 如此做的优点除了实现负责均衡之外，还为我们保留了两份实时热备的数据binlog和relay-log。当服务器发生灾难时，我们可以用他们将数据恢复到任何一个时间点。2.?准备在linux上安装好两台mysql服务器（mysql至少5.5以上），且两台服务器最好在一个机房（在一个局域网内，访问速度远远大于公网，无需流量）。假定主的IP为172.16.0.1，从的IP为172.16.0.2。关闭两台服务器的防火墙（稍后再配置）：iptables stop （这是centos6.5关闭方法，其他系统请问度娘）如果你没有创建数据库，则进行如下操作(1)在主服务器上登录mysql# mysql -uroot -p你的密码(2)创建数据库mysql> create database test1;mysql> create database test2;(3)如果已经有历史数据，则将历史数据备份成sql文件上传到主服务器，运行如下命令mysql> source /disk/test1.sql;（'/disk/test1.sql '换成你自己的路径即可）3. ?主服务器配置mysql已经提供了完美的读写分离与主从复制支持，我们只需要作如下设置即可。1、配置my.cnf# vi /etc/my.cnf(1)去掉log-bin=mysql-bin前的“#”号。这一行的意思是允许mysql使用binlog，同时为主从复制打开了大门。这是关键中的关键中的关键。(2)如果有多个数据库，则添加如下行：binlog-do-db=数据库名1binlog-do-db=数据库名2binlog-do-db=数据库名3binlog-ignore-db=mysql(忽略mysql自身用的数据库)(3)查看server-id是后的数字并记住。slave(从服务器)的server-id不能与该值重复。(4)查看expire-log-day。binlog过期时间，默认为10天。你可以根据你硬盘空间大小及每天产生的数据量修改。如果你有冷备，则一般设成2-3天即可。2、操作数据库(1)在linux命令行下登录mysql# mysql -uroot -p(你的root密码)(2)创建并授权一个帐号mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave_account'@'172.16.0.2' identified by '123456'这句的意思是，允许从服务器'172.16.0.2 '使用'slave-account'及'123456'这个帐号密码对对主服务器的所有数据库（.)进行主从复制（'REPLICATION SLAVE').(3)重启mysql使上述配置生效 # etc/init.d/mysql restart 或# service mysqld restart(4)查看主服务器binlog状态mysql> show master stauts;记下File及Position下的值。以备在配置从服务器时使用。注：File：当前binlog的文件名，每重启一次mysql，就会生成一个新binlog文件 Position：当前binlog的指针位置4.?从服务器配置1、配置mysql.cnf# vi /etc/my.cnf(1)修改server-id=2（该值不能与主服务器的server-id同。如果有多个从服务器，则该值顺延）(2)添加如下两行：relay-log-index=slave-relay-bin.index (中继日志的索引文件）relay-log=slave-relay-bin （中继日志的文件前缀）(3)重启mysql使上述配置生效# /etc/init.d/mysql restart(4)登录mysql#…