mysql主从复制笔记

mysql主从复制笔记(2台阿里云服务器 centos系统 mysql版本最好一致)
1 配置Master主服务器
在Master MySQL上创建一个用户‘dog’,并允许其他Slave服务器可以通过远程访问Master,通过该用户读取二进制日志,实现数据同步。

CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'dog'@'localhost';

ps:先localhost 然后再改成%, 然后从数据库登陆master数据库测试下 能不能连接上

2 找到MySQL安装文件夹修改my.cnf文件。mysql中有好几种日志方式,这不是今天的重点。我们只要启动二进制日志log-bin就ok。

server-id=1 //给数据库服务的唯一标识,一般为大家设置服务器Ip的末尾号 这个地方要注意不能出现relay-log
log-bin=master-bin
log-bin-index=master-bin.index

然后重启mysql 运行如下

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      313 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set

3 设置slave数据库 这个地方要注意不能出现log-bin log-bin-index
找到mysql配置文件

[mysqld]
 server-id=2
 relay-log-index=slave-relay-bin.index
 relay-log=slave-relay-bin 

重启MySQL服务

4 连接Master slave数据库命令输入如下 直接运行

change master to master_host='192.168.1.104',
master_port=3306,
master_user='dog',
master_password='123456',
master_log_file='master-bin.000001',
master_log_pos=313;

如果报错了 那肯定是master权限问题 检查下master权限

5 启动Slave
start slave;

6查看slave状态是否成功

 mysql> show slave status;

        Slave_IO_State: Waiting for master to send event
              Master_Host: 192.168.1.104 //主服务器地址
              Master_User: dog//授权帐户名,尽量避免使用root
              Master_Port: 3306    //数据库端口,部分版本没有此行
              Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
              Read_Master_Log_Pos: 313     //#同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
              Relay_Log_File: ddte-relay-bin.000003
              Relay_Log_Pos: 251
              Relay_Master_Log_File: mysql-bin.000004
              Slave_IO_Running: Yes    //此状态必须YES
              Slave_SQL_Running: Yes     //此状态必须YES

ps:如果Slave_IO_Running显示conecting 那就是change master to master_hos李的参数写错了 仔细对应下 主数据库SHOW MASTER STATUS里的数据
还有看看主服务器的mysql错误日志
还有仔细看看主从数据库配置文件有没有写错

7在主服务器创建个数据库 试试 ps前期 主从数据库内容必须保持一致 不然会报错


mysql> create database dsd;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bird               |
| dsd                |
| hi_db              |
| mysql              |
| performance_schema |
| wordpress          |
+--------------------+
7 rows in set (0.00 sec)

slave数据立马会更新


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| dsd                |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

如果你要查看master 修改的二进制可以去master phpmyadmin 二进制可以查看
ps:原理就是master运行mysql语句 会更新到二进制日志 然后slave读取master的二进制日志 进行运行mysql语句
比如 master执行了一条update语句 slave也会执行一条update语句 如果slave因为表结构跟master不一样 导致运行 sql出错 就会造成主从复制出错

mysql explain亲测

mysql explain亲测

1 where后面字段加索引:数据库类型如果是字符串类型 查询where的时候必须要用 字符串 类型必须一致 否则不用索引 type还是会是all的 ps:如果where有2个字段匹配 那就要2个字段加上索引 这里有必要说明下 btree索引支持匹配索引第一列 也就是说 info1和info2加了复合索引也同时给info1加了索引

2 left join 索引优化的时候 只需要右表字段加索引 还有where后字段加索引 ps左表尽可能的小 因为他不用索引的。。。 适当的时候where左表字段筛选

3 应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。
应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=0
应尽量避免在 where 子句中使用or 来连接条件, 一般用in来代替or 或者 select * from mobantestinfo where info2=33 union all select * from mobantestinfo where info2=36
.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:select id from t where num/2=100应改为:select id from t where num=100*2

4能用唯一索引尽量用唯一索引
5 goupby语句 只需要gourp by后面的字段要加索引 不过type也只能达到index级别

如果是下面语句 没有where什么 其他函数

SELECT *  FROM `mobantestinfo`  GROUP BY info2 

ps:加复合索引 每个字段 type会达到range 注意info2要排第一个才有效果

6 加了索引会降低insert和update速度 所以不要滥用

7搜索url这种可以考虑使用哈希索引 不过需要memory引擎

8给order by加索引能增加排序速度 一般表非常大的时候使用 ps:给order by加索引的时候 前面where字段也要加 不然没效果

9 union all比union 性能好

10避免重复查询刚刚更新的数据 mysql语句如下 第二次不需要查询表 速度会快很多

update mobantestinfo set info1=333 where id=33 AND @now:=333 AND @now1:=444;
select @now as xx,@now1 as xx1;

11 尽量用in代替or 因为or不用索引 in能用索引

mysql 写计数器需要注意的问题

MySql计数器,如网站点击数,如何实现高性能高并发的计数器功能 由于并发的时候 不能同时写入一行数据 所以要分开写

先创建表
CREATE TABLE `article_view`(
    `article_id` int(11) NOT NULL,
    `pond` tinyint(4) NOT NULL COMMENT '池子,就是用来随机用的',
    `view` int(11) NOT NULL,
    PRIMARY KEY (`article_id`, `pond`)
)ENGINE=InnoDB;

小访问量的随机池子100个肯定多了,三五个足矣。每次访问的时候,随机一个数字(1-100)作为pond,如何该pond存在则更新view+1,否则插入,view=1。借助DUPLICATE KE

INSERT INTO `article_view` (`article_id`, `pond`, `view`) VALUES (123, RAND()*100, 1) ON DUPLICATE KEY UPDATE `view`=`view`+1

统计的时候

SELECT SUM(`view`) FROM `article_view` WHERE `article_id`='123'

2 还有就是用消息队列的 一般用消息队列比较靠谱(特别有百万数据的时候)