MySQL安装

1. 软件版本

数据库版本为解压版MySQL mysql-5.7.22-el7-x86_64.tar.gz

2. 查看系统之前是否有安装过mysql相关版本

rpm -qa|grep mysql
rpm -qa|grep mariadb
rpm -qa|grep mysql|xargs rpm -e --nodeps
rpm -qa|grep mariadb|xargs rpm -e --nodeps

3. 检查mysql组和用户是否存在

cat /etc/group|grep mysql
mysql:x:27
cat /etc/passwd|grep mysql
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
以上为默认存在的情况,如无,执行添加命令:
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
-r参数表示用户是系统用户,不可用于登录系统
userdel -r mysql删除用户
groupdel mysql删除组

4. 数据库软件准备

mkdir -p /home/mysql/data
tar -xzvf mysql-5.7.22-el7-x86_64.tar.gz
mv mysql-5.7.22-el7-x86_64 /home/mysql/mysql
chown -R mysql:mysql /home/mysql

5. 初始化数据库

cd /home/mysql/mysql/bin
./mysqld --initialize --user=mysql --basedir=/home/mysql/mysql/ --datadir=/home/mysql/data/
记住初始密码(ZBy%#Uh45%gj)

6. 配置数据库

vi /etc/my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[mysqld]
basedir = /home/mysql/mysql/
datadir = /home/mysql/data/
character-set-server = utf8
pid-file=/home/mysql/data/mysqld.pid
back_log=1024
wait_timeout=1800
max_connections=3200
max_user_connections=800
skip-name-resolve
innodb_buffer_pool_size=100M
innodb_log_buffer_size=20M
read_buffer_size=10M
sort_buffer_size=10M
read_rnd_buffer_size=10M
server-id=100
log-bin= master
max_binlog_size=100M
expire_logs_days=30
[mysql]
default-character-set=utf8

7. 配置解释

back_log=1024
back_log的值指出在mysql暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。也就是说,如果mysql的连接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。
wait_timeout=1800
mysql连接闲置超过此设定值的时间后将会被强行关闭,单位是秒。
max_connections=3200
指mysql的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这是建立在机器能支撑的情况下,因为如果连接数越多,介于mysql会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。
max_user_connections=800
指每个数据库用户的最大连接。针对某一个账号的所有客户端并行连接到mysql服务的最大并行连接数。简单说是指同一个账号能够同时连接到mysql服务的最大连接数。设置为0表示不限制。
thread_concurrency=CPU核数x2
此值应设为CPU核数的2倍。
skip-name-resolve
禁止mysql对外部连接进行DNS解析,使用这一选项可以消除mysql进行DNS解析的时间。
innodb_buffer_pool_size<=服务器内存x0.7
用于缓存索引和数据的内存大小。
innodb_log_buffer_size=20M
InnoDB存储引擎的事务日志所使用的缓冲区。
read_buffer_size=10M
这个值代表读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区。
sort_buffer_size=10M
执行排序使用的缓冲大小。
read_rnd_buffer_size=10M
随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,mysql会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。
binlog=日志名字
mysql的二进制日志是mysql最重要的日志,它记录了所有的DDL和DML语句,以事件形式记录,还包含语句所执行的消耗的时间,mysql的二进制日志是事务安全型的。

8. 启动MySQL

cp /home/mysql/mysql/support-files/mysql.server /etc/init.d/mysqld
systemctl start mysqld
若数据库启动失败,则通过日志查看一下错误原因
cat /home/mysql/data/localhost.localdomain.err
若错误提示为thread_concurrency=4,将my.cnf中此项删除即可
[配置开机启动项]
方法一:
systemctl enable mysqld
方法二:
chkconfig --add mysqld
chkconfig --level 2345 mysqld on
查看和删除启动项:
chkconfig --list可以查看所有启动项
chkconfig --del mysqld删除启动项

9. 修改密码

[将mysql命令添加到环境变量]
vi /etc/profile
末尾增加export PATH=$PATH:/home/mysql/mysql/bin
[重新读取环境变量]
source /etc/profile
[修改MySQL密码]
mysql_secure_installation

10. 修改远程访问权限

mysql -uroot -p
输入密码回车后开始本地mysql操作
mysql> use mysql;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
[GRANT ALL PRIVILEGES赋予全部权限,”.”对所有数据库和表,root被授权的用户,%被授权的IP(%为全部),123456被授权的密码,WITH GRANT OPTION被授权的用户可以授权其他用户]
mysql> flush privileges;

11. 主从复制

配置注意事项
1.主从服务器操作系统版本和位数一致
2.两台数据库服务器的的selinux都要disable
3.Master和Slave数据库的版本要一致
4.Master和Slave数据库中数据要一致
5.Master开启二进制日志,Master和Slave的server_id在局域网内必须唯一

1. master配置

vi /etc/my.cnf
在[mysqld]中增加以下配置项
[server_id,一般设置为 IP]
server_id = 151
[复制过滤: 需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行]
binlog-do-db = test
[开启二进制日志功能, 可以随便取, 最好有含义]
log-bin = /usr/local/mysql/log/mysql-bin.log
[为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存]
binlog_cache_size = 1M
[主从复制的格式(mixed,statement,row,默认格式是 statement)]
binlog_format = mixed
[二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除]
expire_logs_days = 7
[跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。如1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致]
slave_skip_errors = ALL
[relay_log 配置中继日志]
relay_log = /usr/local/mysql/log/mysql-relay-bin.log
[log_slave_updates 表示 slave 将复制事件写进自己的二进制日志]
log_slave_updates = 1
[sync_binlog表示每几次事务提交,MySQL把binlog缓存刷进日志文件中,默认是0,最安全的是设置为1]
sync_binlog = 1
其他参数说明
replicate-ignore-db=mysql,information_schema,performance_schema
[不同步mysql系统数据库]
replicate_wild_do_table 和 replicate_wild_ignore_table
[参数解决同步所有跨数据库的更新,与replicate-do-db或者replicate-ignore-db类似]
auto_increment_increment和auto_increment_offset
[这两个参数一般用在主主同步中,用来错开自增值,防止键值冲突]
slave-skip-errors= [err1,err2,…….|ALL]
[用来定义复制过程中从服务器可以自动跳过的错误号(1062,1053,1146),当复制过程中遇到定义的错误号,就可以自动跳过,直接执行后面的SQL语句,慎用,当启动这个参数,MYSQL会忽略那些错误,可能造成主从数据库的数据不同步。]
master-connect-retry
[这个参数是用来设置在和主服务器连接丢失的时候,重试的时间间隔,默认是60秒]
log-slave-updates
[这个参数用来配置从服务器的更新是否写入二进制日志,这个选项默认是不打开的,但是,如果这个从服务器B是服务器A的从服务器,同时还作为服务器C的主服务器,那么就需要开发这个选项,这样它的从服务器C才能获得它的二进制日志进行同步操作]
创建数据同步用户
mysql> grant replication slave on *.* to 'es1'@'192.168.0.%' identified by '123456';
mysql> flush privileges;
查看Master状态
mysql> show variables like "log_bin";

1
2
3
4
5
6
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)

mysql> show master status;

1
2
3
4
5
6
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
2. slave配置

server_id = 128,其它配置项与master一致
配置同步参数
change master to master_host='192.168.76.127',master_user='es1',master_password='123456',master_port=3306,master_log_file='mysql-bin.000001', master_log_pos=154, master_connect_retry=30;
mysql> flush privileges;
mysql> show slave status\G;
可看到Slave_IO_State为空,Slave_IO_Running和Slave_SQL_Running是 No,表明此时Slave还没有开始复制过程
开启主从同步
mysql> start slave;
mysql> show slave status\G;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.76.127
                  Master_User: es1
                  Master_Port: 3306
                Connect_Retry: 30
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 591
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
1 row in set (0.00 sec)  
  
ERROR:   
No query specified

至此,mysql主从复制配置完成,在master上对数据库的操作会自动同步到salve上

12. 主主复制

主主复制即在两台MySQL主机内都可以变更数据,而且另外一台主机也会做出相应的变更,数据记录通过二进制传达给对方从而保持数据的一致性。
原理是将两个主从复制有机合并起来(A主从复制+B主从复制==A、B主主复制),因此主主复制中必须要解决的事情就是自增主键的问题(如果mysql1主键id增加到12了,此时二进制数据还没到达mysql2,mysql2恰好要插入数据,那么新数据主键id也是12,会产生冲突。)
解决方法是更改MySQL中配置文件的相关配置项。
# vim /etc/my.cnf
在[mysqld]中增加以下配置项
[步进值,一般有n台主MySQL就填n]
auto_increment_increment = 2
[起始值,一般第n台主MySQL就填n]
auto_increment_offset = 2
之后进行两次主从复制配置即可
注意事项:
1、主主复制配置文件中auto_increment_increment和auto_increment_offset只能保证主键不重复,却不能保证主键有序。
2、当配置完成Slave_IO_Running、Slave_SQL_Running不全为YES时,show slave status\G信息中有错误提示,可根据错误提示进行更正。
常见出错点:
1、两台数据库都存在db数据库,而第一台MySQL db中有tab1,第二台MySQL db中没有tab1,那肯定不能成功。
2、已经获取了数据的二进制日志名和位置,又进行了数据操作,导致POS发生变更,在配置CHANGE MASTER时还是用到之前的POS。
3、stop slave后,数据变更,再start slave,出错。

13. 同步问题解决

13.1 同步状态查看

Slave_IO_Running:Slave_SQL_Running:的结果都是Yes,代表同步状态正常。

13.2 跳过异常事务(错误)

[关闭同步]
mysql>slave stop;
[跳过一个事务]
mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1
[启动同步]
mysql>slave start