一、mysql 5.7版本 rpm的安装
1.本地yum源完好、selinux关闭、iptables关闭
2.安装最基本的编译工具
yum install gcc gcc-c++ ncurses-devel -y
3.安装mysql5.7.14(rpm版)
mkdir /mysql-5.7.14
mv /mysql-5.7.14-1.el6.x86_64.rpm-bundle.tar /mysql-5.7.14
cd /mysql-5.7.14/
tar xf mysql-5.7.14-1.el6.x86_64.rpm-bundle.tar
yum localinstall *.rpm -y
4.配置参数
mkdir -p /data/mysql
chown -R mysql:mysql /data/mysql
cd /usr/bin
mysql_install_db --datadir=/data/mysql --user=mysql
5.启动mysqld服务
service mysqld start
6.初始密码的位置
初始密码在 /var/log/mysqld.log,关键字 temporary password
grep password /var/log/mysqld.log
7.登录,修改密码
mysql -uroot -puoko6PvBgj/!
第一次登录后,必须修密码,且密码安全性必须高。不然会提示:
这个其实与 validate_password_policy 的值有关,
validate_password_policy有以下取值:
policy | Tests Performed |
---|---|
0 or LOW | Length |
1 or MEDIUM | Length; numeric, lowercase/uppercase, and special characters |
2 or STRONG | Length; numeric, lowercase/uppercase, and special characters; dictionary file |
默认是1,即MEDIUM,所以刚开始设置的密码必须符合长度,且必须含有数字,小写或大写字母,特殊字符。
有时候,只是为了自己测试,不想密码设置得那么复杂,譬如说,我只想设置root的密码为123123。
则必须修改两个全局参数:
mysql> set global validate_password_policy=0;
#判断密码的标准`仅基于密码的长度
mysql> set global validate_password_length=4;
#密码长度最少要为4位
修改成自己的密码:
mysql> SET PASSWORD FOR 'root'@'localhost' = password('123123');
二、压力测试、优化吞吐量
1、安装tpcc
unzip tpcc-mysql-master.zip #解压tpcc
cd /tpcc-mysql-master/src/
make
ls
如果 make 没有报错,就会在/tpcc-mysql-master 下生成 tpcc 二进制命令行工具 tpcc_load 、 tpcc_start
2、初始化测试库环境
cd /tpcc-mysql-master
mysqladmin -uroot -p123123 create tpcc1000 #创建测试用的数据库
mysql -uroot -p123123 -f tpcc1000 < create_table.sql #创建测试用的表
mysql -uroot -p123123 -f tpcc1000 < add_fkey_idx.sql #创建FK和索引
3、加载数据仓库
cd /tpcc-mysql-master
./tpcc_load -h127.0.0.1 -d tpcc1000 -u root -p "123123" -w 10
创建10个数据仓库(速度快,一般正经测试要150个左右才有效果)
4、开始测试
cd /tpcc-mysql-master
./tpcc_start -h127.0.0.1 -dtpcc1000 -uroot -p123123 -w10 -c32 -r10 -l10800 -f tpcc-output-log
即:模拟 10个仓库规模,并发32个线程进行测试,热身时间为 10秒, 压测时间为 3小时。
5、根据得到的压测数据(trx的值),画出优化前的趋势图
可以看到,优化前trx平均值在63左右。
6、调整参数
将下面的参数写到配置文件里,重启mysqld服务即可
innodb_buffer_pool_size = 2G
#池子调成2G,物理内存的50%-80%
innodb_buffer_pool_instances = 16
#池子数量,一般是2的n次方倍,比如说4,8,16,32
innodb_log_file_size=1G
#redo log调整成1G
innodb_lru_scan_depth = 4096
#每次查找脏页的深度,增大该参数可增大脏页写入速度
innodb_flush_method = O_DIRECT
#innodb写时绕过文件系统缓存,挺重要
innodb_thread_concurrency = 8
#最好调大,允许最大并发数量,等于核数,两倍核数最大,并发性能提升明显
下面是降低IO等待:
slow_query_log = 1 #慢查询
slow_query_log_file = slow.log #慢查询日志的名字
long_query_time = 2 #设置多久才算是慢查询,可以设置为0.几秒
7、重新压测,发现性能大大提升:
由计算得,平均值为1357。
三、主从(一主一从)的配置
1、备库要安装和主库相同的版本的软件,删除备库上的东西
/etc/my.cnf #删除
datadir目录下面的内容 #删除
sock文件、pid文件 #删除,数据库关闭情况下,这两个文件很可能已经消失
binlog文件 #最好删除
undo文件 #一般在datadir中
redo文件 #一般在datadir中
2、修改主库的参数文件
log_bin=/mysqlbin/mybin.log
server_id=1
binlog_format=row
master_info_repository = TABLE
relay_log_info_repository = TABLE
sync_binlog = 1
#事务提交时,每次都会把binlog刷到磁盘上(永久保存)(0表示写到文件系统上,而不是磁盘上;2表示2次提交刷一次到磁盘;3...3次)
gtid_mode = on
#启用gtid类型,否则就是普通的复制架构
enforce_gtid_consistency = 1
#强调gtid的一致性(GTID能够保证让一个从服务器到其他的从服务器那里实现数据复制而且能够实现数据整合的。GTID在分布式架构中可以保证数据的一致性。从而也实现了mysql的高可用性。)
relay_log = relay.log
relay_log_recovery = 1 #主库坏了时,自动恢复
slave-rows-search-algorithms = 'INDEX_SCAN,HASH_SCAN'
#从库执行主库的sql时,优先走索引。('TABLE_SCAN'就是优先走全表扫描)
3、重启服务使修改生效
mysqld_safe --user=mysql &
mysql -uroot -p123123
(但是service mysqld start失败是为什么?)
4、使用xtrabackupex备份主库
(1)安装
①
yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bison libtool ncurses-devel libgcrypt-devel libev-devel libcurl-devel vim-common
②
rpm -ivh libev4-4.15-7.1.x86_64.rpm
③
rpm -ivh libev-devel-4.15-21.1.x86_64.rpm
(上面两个软件需要单独安装)
④解压
mkdir /xtrabackup
mv Percona-XtraBackup-2.4.4-rdf58cf2-el6-x86_64-bundle.tar /xtrabackup
tar xf Percona-XtraBackup-2.4.4-rdf58cf2-el6-x86_64-bundle.tar
yum localinstall *.rpm
⑤
innobackupex --help
⑥建立备份目录 /backup/
⑦授权备份目录,给主库做全备
chown -R mysql:mysql /backup
innobackupex --user=root --password=123123 --no-timestamp /backup
innobackupex --apply-log /backup/ #
5、从库服务器建立/backup目录并授权
mkdir /backup
chown -R mysql:mysql /backup
6、将主库的配置文件复制到从库,并修改/etc/my.cnf:
重点修改:
server_id=2
7、主库上建立用户
mysql> set global validate_password_policy=0;
mysql> set global validate_password_length=4;
mysql> create user 'congku'@'192.168.159.132' identified by '123123';
mysql> grant replication slave on *.* to 'congku'@'192.168.159.132';
从库上测试一下:
8、在主库上scp把备份文件传给从库的/backup
cd /backup
scp -r * 192.168.159.132:/backup
(此时用# sar -n DEV 1 #可以看网速)
9、恢复从库
chown -R mysql:mysql /backup/*
innobackupex --move-back /backup/
10、启动从库
mysqld_safe --defaults-file=/etc/my.cnf --skip-slave-start --user=root &
(启动从库,但是不启动从库线程)
(有时不加–user=root会报错pid ended…)
11、查看备份点
cat xtrabackup_info
主要看:
binlog_pos = filename ‘mysqlserver.000019’, position ‘120’
12、建立主从关系
mysql> change master to master_host='192.168.159.131',master_user='congku',master_password='123123',master_log_file='mastera.000028',MASTER_LOG_POS=245; (注意pos没有引号!)
分别对应上面xtrabackup_info里面的binlog_pos
13、在从库启动主从
mysql > start slave;
14、看一下主库、从库的线程状态
我的状态:
Slave_IO_State: Connecting to master
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
主从安装过程中的排错过程
①关闭主库防火墙!service iptables stop;
②重新在主库建立一个用于同步的用户;flush privileges或者重启主库;
③从库上先登录试试,然后root登录从库,建立主从关系时用主库建立的新用户”congku”登录;
问题的原因:
①网络不通
②密码不对
③pos不对
④selinux没关(注释掉targeted)或者iptables没关
下面是正确的从库状态:
mysql >show processlist;
mysql>show master statusG;
mysql>show slave statusG;
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.159.131
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqlserver.000002
Read_Master_Log_Pos: 7135053
Relay_Log_File: mysqlserver-relay-bin.000002
Relay_Log_Pos: 7135218
Relay_Master_Log_File: mysqlserver.000019
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 7135053
Relay_Log_Space: 7135397
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: b2f61717-1341-11e6-906d-080027baba17
Master_Info_File: /mysqldata/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
1 row in set (0.00 sec)
mysql>
上面标注的两个红色的量,用来看传输延迟!
15、执行sql或压力测试,再来看主从的状态
create table item2 as select * from item;
或
压测
PS
mysql5.7主从的新特性
slave-parallel-type = LOGICAL_CLOCK #基于时间的并行。大大提升同步速度。
slave-parallel-workers = 16 #在从库上启动16个线程来并发复制,大大提升同步速度。
slave_preserve_commit_order=1
(全局动态变量,默认0,可选值0、1。 表示是否需要严格保持顺序,默认值为0表示并发执行忽略顺序。对于多线程slaves,来保障事务在slave上执行的顺序与relay log中的顺序严格一致,只有当slave_parallel_workers开启时有效,此时log_bin、log_slave_updates必须开启,而且slave_parallel_type值必须为LOGICAL_CLOCK(默认值为DATABASE),如果你的事务经常是跨DB操作,那么可以考虑使用此参数限定顺序。当此参数开启时,要求任何worker线程执行事务时,只有当前事务中此之前的所有事务都执行后(被其他worker线程执行),才能执行和提交。)slave_transaction_retries=128 #锁超时时,先不回滚,先再尝试128次。