mysql 8.0.22安装linux及主从搭建

一、软件下载与安装
1.mysql官网下载二进制文件,上传服务器,解压
2.参考官网安装手册 doc
shell> groupadd mysql
shell> useradd -r -g mysql -s /bin/false mysql
shell> cd /usr/local
shell> tar xvf /path/to/mysql-VERSION-OS.tar.xz
shell> ln -s full-path-to-mysql-VERSION-OS mysql  #此步改为mv mysql-8.0.22-linux-glibc2.12-x86_64 mysql
shell> cd mysql
shell> mkdir mysql-files
shell> chown mysql:mysql mysql-files
shell> chmod 750 mysql-files
shell> bin/mysqld --initialize --user=mysql       #记住此执行出来的密码 
2020-12-09T07:15:35.971853Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2020-12-09T07:15:35.971977Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.22) initializing of server in progress as process 1430
2020-12-09T07:15:36.000042Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2020-12-09T07:15:37.034094Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2020-12-09T07:15:37.903144Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: C0tAm:aX;Ui&
shell> bin/mysql_ssl_rsa_setup
shell> bin/mysqld_safe --user=mysql &     #开启mysql服务
2020-12-09T07:16:59.497136Z mysqld_safe error: log-error set to '/var/log/mariadb/mariadb.log', however file don't exists. Create writable for user 'mysql'.
# Next command is optional
shell> cp support-files/mysql.server /etc/init.d/mysql  #mysql可以自己选择命名,mysql会配置开机自动启动


3.修改/etc/my.cnf文件
vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
#socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
#symbolic-links=0 #MySQL数据库及表(仅MyISAM)支持符号链接(symbolic link),即数据库或表可以存储在my.cnf中指定datadir之外的分区或目录。要支持符号链接,需要在配置中设置symbolic-links=1(较新的版本为默认开启)
character-set-server=utf8mb4
default_authentication_plugin=mysql_native_password  #使用以前老版本的加密模式,如果不使用,很多如mycat,hive等链接过来都会包密码错误

port=3306
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

slow_query_log=1  #开启慢sql查询日志
slow_query_log_file=/var/lib/mysql/master-slow.log #开启慢sql查询日志文件
long_query_time=3  #定义慢sql时间,单位秒

log_bin_trust_function_creators=1 #简单介绍一下,当二进制日志启用后,这个变量就会启用。它控制是否可以信任存储函数创建者,不会创建写入二进制日志引起不安全事件的存储函数。
                                  #如果设置为0(默认值),用户不得创建或修改存储函数,除非它们具有除CREATE ROUTINE或ALTER ROUTINE特权之外的SUPER权限。 
                                  #设置为0还强制使用DETERMINISTIC特性或READS SQL DATA或NO SQL特性声明函数的限制。 如果变量设置为1,MySQL不会对创建存储函数实施这些限制。 
                                  #此变量也适用于触发器的创建。

log-bin=mysql-bin #主从复制要开启二进制文件
server-id=1  #主从复制要指定一个id
binlog-ignore-db=mysql #不要同步mysql库 #也可以配置 binlog-do-db=dbname 要配置同步的库名称
binlog-format=MIXED  #默认是STATEMENT #设置二进制文件格式;如果是STATEMENT时并不安全,事务隔离级别为 READ-COMMITTED的InnoDB引擎,配置hive时会报错

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

3.启动mysql服务
/etc/init.d/mysql.server start
root       1724      1  0 17:02 pts/0    00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/master.pid
mysql      1888   1724 16 17:02 pts/0    00:00:01 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/var/lib/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/lib/mysql/master.pid --port=3306

登录mysql更改密码
/usr/local/mysql/bin/mysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'yehaver';  #刚安装完只能使用此语句修改密码
use mysql;
update user set host = '%' WHERE user='root';
flush privileges;
ALTER USER 'root'@'%' IDENTIFIED BY 'yehaver';   #是提供远程登录
flush privileges;  #每次权限更新都要刷新


4.安装报错修改
2020-12-09T07:16:59.497136Z mysqld_safe error: log-error set to '/var/log/mariadb/mariadb.log', however file don't exists. Create writable for user 'mysql'.
mkdir /var/log/mariadb
touch /var/log/mariadb/mariadb.log
chown -R mysql:mysql /var/log/mariadb/

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
vim /etc/my.cnf
#socket=/var/lib/mysql/mysql.sock  #注释此,sock模式不让本地登录

5.设置mysql自启动
chkconfig mysql.server on  #mysql.server文件是你复制 /etc/init.d/下的文件名cp support-files/mysql.server /etc/init.d/mysql.server。可以换不同文件名
chkconfig  --list  #检查自启动是否生效
systemctl status mysql.server

6.设置环境变量
vi /root/.bash_profile
export MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$MYSQL_HOME/bin
source /root/.bash_profile

7.启动停止mysql
systemctl stop mysql.service
systemctl start mysql.service
systemctl status mysql.service

二、mysql优化
explain select * from t_user; #生成执行计划
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table       | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | primary     | t2          | NULL       | range| NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL  |
|  2 | simple      | t1          | NULL       | index| NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL  |
|  3 | derived     | t3          | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL  |
|  1 | union       | <derived3>  | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL  |
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------+
总结:
1.id越大,mysql最先执行;id相同,排在最上面的最先执行
2.t3会derived先执行出来的虚拟表,然后<derived3>为虚拟表再分析执行

select_type有如下类型
SIMPLE        简单表,不使用表连接或子查询
PRIMARY        主查询,即最外层的查询
SUBQUERY    子查询中的第一个
derived     派生表,由其它子查询产生,有可能会生成临时表
UNION        UNION中的第二个或者后面的查询语句
UNION RESULT union结果集
DEPENDENT SUBQUERY 在select 或where列表中包含了子查询,子查询基于外层
uncacheable subquery  不可用缓存的子查询,使用了系统变量

partitions:如果查询的有表分区,会命中分区名

type有如下类型
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all
system  表只有一条记录
const   索引扫描一次;主键索引和唯一索引找到一条记录
eq_ref  唯一索引扫描;主键索引和唯一索引关键表
ref     索引扫描;返回关联表一条或多条记录的关键表
range   索引范围扫描;条件中有 >=  <= > < between and in (x1,x2)
index   full index scan;索引全扫描,查询全表且只查索引字段
all     全表扫描
index_merge  合并索引,col1 is null or col2 = 1;
ref or null  既需要关联也需要 null
index_subquery  利用索引来关联
unique_subquery 子查询中用到唯一索引


possible_keys  查询涉及到的字段存在多个索引,则索引被列出,但不一定被使用;显示用到的索引名
key          实际被使用的索引。  如使用了覆盖索引,则该列出现在key列中;显示用到的索引名
key_len      索引使用的字节数,此值越大越好
ref           索引被使用的情况;可能是一个常量,可能是关联id条件
rows          每张表有多少条数据被读取
filtered    返回的数据在server层过滤后,剩下满足查询记录数的比例

Extra         其它需要展示的重要信息
  using filesort  外部索引排序
  using temporary 使用了临时表保存中间结果
  using index     使用了覆盖索引;覆盖索引:查询的字段正好是索引的字段,就会使用覆盖索引;特殊案例:当查询条件用like '%abc%'时,查询字段指定为索引字段可走索引扫描
  using where       使用了条件
  using join buffer 使用了连接缓存
  impossible where 条件中本身就是fasle,一般为 where 1=2
  select tables optimized away   myisam已经保存了记录的总数等信息,直接返回结果,,而innodb还需要全表扫描。
  distinct            找到第一匹配的元组后立即停止找到相同的值

sort_buffer_size : 如果在执行计划中有排序ORDER BY ,且出现排序缓冲区不够写临时文件时,可能需要调大此参数
max_length_for sort_data: 执行计划中有排序,且查询的字段又太多,这个也需要调大

2.开启mysql慢日志信息  mysqldumpslow
show variables like '%slow_query_log%'; #查看日志是否开启,仅本次生效,下次重启后失效
show variables like '%long_query_time%'; #定义慢sql时间,单位秒
show global status like '%slow_queries%';#查询系统慢sql数量
 
set global slow_query_log = 1;
set global long_query_time = 3;  #修改后重新链接才看得到
set global log_bin_trust_function_creators = 1;
永久生效方法
在my.cnf文件中,[mysqld]下面新增如下参数。然后重启mysql服务
slow_query_log=1  #开启慢sql查询日志
slow_query_log_file=/var/lib/mysql/master-slow.log #开启慢sql查询日志文件
long_query_time=3  #定义慢sql时间,单位秒
log_bin_trust_function_creators=1 #简单介绍一下,当二进制日志启用后,这个变量就会启用。它控制是否可以信任存储函数创建者,不会创建写入二进制日志引起不安全事件的存储函数。如果设置为0(默认值),用户不得创建或修改存储函数,除非它们具有除CREATE ROUTINE或ALTER ROUTINE特权之外的SUPER权限。 设置为0还强制使用DETERMINISTIC特性或READS SQL DATA或NO SQL特性声明函数的限制。 如果变量设置为1,MySQL不会对创建存储函数实施这些限制。 此变量也适用于触发器的创建。

mysqldumpslow --help可显示其参数的使用
-s,是order的顺序
al   平均锁定时间
ar   平均返回记录时间
at   平均查询时间(默认)
c    计数
l    锁定时间
r    返回记录
t    查询时间
-t,是top n的意思,即为返回前面多少条的数据
-g,后边可以写一个正则匹配模式,大小写不敏感的

mysqldumpslow -s t -t 10 -a slow.log  #常用,其它请百度

3.开启mysql慢sql资源步骤分析profiling
show variables like '%profiling%'; #查看profiling日志是否开启
set profiling=1; #此只在当前会话开启,用来分析当条sql慢,dba来研究分析。后面所有查询的sql都会记录详细资源使用情况
sql语句。。。
show profiles; #展示上面写的sql语句执行情况
show profile for query xx_id  #详细展示上面某条sql资源使用情况 show profile for query 3;
show profile cpu,block io for query 3; #增加了cpu,io使用情况


4.全局查询日志  此用到比较少,生产不要开启此功能。略


5.mysql锁机制
表锁:myisam
unlock tables; 解锁所有表
lock tables 表名 read或者write #给指定的表加读锁或写锁
show open tables; #展示所有锁住的表

Mylsam引擎在执行查询语句(select)前,会自动涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。
MYSQL的表级锁有两种模式:
1.表共享读锁(Table Read Lock)
2.表共享写锁(Table Write Lock)

table_locks_immediate:表示立即获取锁的查询次数,没获取一次加1
table_locks_waited:表示表级锁争用而发生等待的次数,每等待一次加1

Table_locks_immediate表示立即释放表锁数,Table_locks_waited表示需要等待的表锁数,
如果Table_locks_immediate / Table_locks_waited > 5000,最好采用InnoDB引擎,
因为InnoDB是行锁而MyISAM是表锁,对于高并发写入的应用InnoDB效果会好些。
示例中的服务器Table_locks_immediate / Table_locks_waited = 235,MyISAM就足够了。

行锁:innoDB
select * from table_name where a.col1=8 for update; #锁定一行

show status like '%innodb_row_lock%'  #查询行锁情况
Innodb_row_lock_current_waits:当前正在等待锁的数量;
Innodb_row_lock_time:从系统启动到现在锁定总时间长度;
Innodb_row_lock_time_avg:每次等待所花平均时间;
Innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花的时间长度;
Innodb_row_lock_waits:系统启动到现在总共等待的次数;

6.杀掉锁的进程
show processlist;  #查询mysql所有运行的进程
kill @Id;  #杀掉上面查询出来的某个id

三、主从复制
主机
1.my.cnf文件配置
[mysqld]
log-bin=mysql-bin
server-id=1
binlog-ignore-db=mysql #不要同步mysql库 #也可以配置 binlog-do-db=dbname 要配置同步的库名称
binlog-format=STATEMENT #设置二进制文件格式   STATEMENT,ROW,MIXED具体百度意思;都是直接使用MIXED
2.CREATE USER 'repl'@'从机ip' IDENTIFIED WITH mysql_native_password BY '密码';
  GRANT REPLICATION SLAVE ON *.* TO '主机用户'@'从机ip';
3.flush privileges;
4.show master status;

从机
先按照软件下载与安装重新搭建一个mysql
1.my.cnf配置
[mysqld]
log-bin=mysql-bin  #从机可选
server-id=2  #和上面要不一样
relay-log=s1-relay-bin  #同步日志文件名 默认是使用 主机名来定义的,当你的服务器作为slave并且更改主机名的时候,同步会被停止。如果你一直没有改主机名就无所谓
2.登录mysql,配置从机同步
/usr/local/mysql/bin/mysql -u root -p
change master to master_host='主机ip',master_user='repl',master_password='密码',master_log_file='binlog.000009',master_log_pos=156;   
#master_log_pos 主机show master status的Position值   #master_log_file 主机 show master status的file值
3.start slave;
4.show slave status\G  #slave_io_running=yes和slave_sql_running=yes才叫同步成功


上述只能同步新数据库里面的东西,历史库需要手动同步
1.主库导出db_user数据库
FLUSH TABLES WITH READ LOCK;  #锁定主数据库
SHOW MASTER STATUS;  #查询主数据库状态,并记下FILE及Position的值
./mysqldump -uroot -p --databases db_user > db_user.sql  #退出mysql终端,执行mysql备份命令
scp db_user.sql 'root'@'172.190.0.0:/opt/data'  # 复制到另外一台机器, 并输入对应的密码

2.从库同步历史库数据
# 在导入备份文件之前,需要在从库中手动建立相应的同名库
CREATE DATABASE test;
mysql -uroot -p < db_user.sql
stop slave; #如果主从备份开启先停止
#之后再次配置上面的主从备份 
...
start slave;
show slave status\G
select * from mysql.slave_master_info \G  #查看主从配置参数
 
3.主库解锁
unlock tables;
测试历史库表插入数据是否在备库中已经有了
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值