MySQL主从复制

1、简介
我们为什么要用主从复制?主从复制目的:
可以做数据库的实时备份,保证数据的完整性;
可做读写分离,主服务器只管写,从服务器只管读,这样可以提升整体性能。

下图是MySQL官方给出了使用Replication的场景:


原理图:

2、VMware安装 CentOS-7-x86_64-DVD-1511.iso 此步骤略过
暂时分配2G空间,等所有都安装完毕就改成1G (为了安装软件快速 电脑内存8G) 先装两台,在装一台
分配IP为 192.168.0.220、192.168.0.221、192.168.0.222 简单起见root 和 myql密码 都为123456
安装成功后安装两个软件 yum install wget #获取软件 yum install net-tools #ifconfig 工具
3、安装mysql 并修改密码(centos7删除了MySQL,所以我们找到其他源)
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
yum install mysql-server
service mysqld restart
mysql -u root
use mysql; update user set password=password(‘123456′) where user=’root’;
GRANT ALL PRIVILEGES ON *.* TO ‘root’@’%’ IDENTIFIED BY ‘123456’ WITH GRANT OPTION; — 配置外网访问
FLUSH PRIVILEGES;

Read More →

某张表数据量很大,但只需保留最近3个月的数据,直接删数据又怕客户找麻烦,所以就想创建一张备用表,将3个月以前的数据挪到备用表中。
环境
CentOS 6.7 32bit
MySQL 5.6.X
操作

# 创建归档表(只复制表结构和索引)
CREATE TABLE MyTableBak like MyTable;

# 删除归档表的所有索引(这样可以提高插入速度)

# 将3个月以前的数据导入归档表
INSERT INTO MyTableBak SELECT * FROM MyTable WHERE date < ‘2015-12-25’;

# 删除原表3个月以前的数据
DELETE FROM MyTable where date < ‘2015-12-25’

来源:http://yestreenstars.blog.51cto.com/1836303/1744832/

MySQL报错 Lock wait timeout exceeded; try restarting transaction
1,查看数据库的隔离级别:

mysql> select @@tx_isolation;
+—————–+
| @@tx_isolation |
+—————–+
| READ-COMMITTED |
+—————–+
1 row in set (0.00 sec)
2,去查看先当前库的线程情况:
mysql> show full processlist;

没有看到正在执行的慢SQL记录线程,再去查看innodb的事务表INNODB_TRX,看下里面是否有正在锁定的事务线程,看看ID是否在show full processlist里面的sleep线程中,如果是,就证明这个sleep的线程事务一直没有commit或者rollback而是卡住了,我们需要手动kill掉。

mysql> SELECT * FROM information_schema.INNODB_TRX;

3,看到有两条记录,然后找到 trx_mysql_thread_id
mysql> SELECT trx_mysql_thread_id FROM information_schema.INNODB_TRX;

mysql> kill 7226287;
Query OK, 0 rows affected (0.00 sec)

mysql> kill 5201247;
Query OK, 0 rows affected (0.00 sec)

然后再去查询INNODB_TRX表,就没有阻塞的事务sleep线程存在了,如下所示:
mysql> SELECT * FROM information_schema.INNODB_TRX;

再去执行update语句,就能正常执行了,如下所示:
4,总结分析
表数据量也不大,按照普通的情况来说,简单的update应该不会造成阻塞的,mysql都是autocommit,不会出现update卡住的情况,去查看下autocommit的值。
mysql> select @@autocommit;
+————–+
| @@autocommit |
+————–+
| 1 |
+————–+
1 row in set (0.00 sec)

如果是0的话 就设置为1 set global autocommit=1;

最近做一个项目  不同平台下  需要unionID为唯一。之前做过users表中做过openid,现在要做一下unionID

– – 创建unionid

ALTER TABLE `users`
ADD COLUMN `unionid` varchar(40) NULL COMMENT ‘微信unionid’ AFTER `openid`;

alter table users add unique key unionid(unionid,plat);