MySQL

示例使用二进制文件安装部署

安装部署

解压

#tar  xzvf  mysql-8.0.18-el7-x86_64.tar.gz

配置文件

#cp  /etc/my.cnf  /etc/my.cnf_bak

#vim  /etc/my.cnf

        [client]

        port = 3306

        socket = /tmp/mysql.sock

        [mysqld]

        port = 3306

        basedir = /project/mysql/mysql-8.0.18

        datadir = /project/mysql/data

        pid-file = /project/mysql/mysql-8.0.18/mysqld.pid

        socket = /tmp/mysql.sock

        tmpdir = /project/mysql/tmp

        user = mysql

        #关闭MySQL X plugin(33060)

        mysqlx=0

        ###日志配置------

        innodb_log_file_size = 1G

        log_error = /project/mysql/mysql-8.0.18/log/error.log

        slow_query_log = 1

        long_query_time = 5

        slow_query_log_file = /project/mysql/mysql-8.0.18/log/slow.log

        #记录没有索引导致的慢查询

        ###连接配置------

        #最大连接数

        max_connections = 3000

        #最大错误连接数

        max_connect_errors = 10

        #连接闲置超时时间

        interactive_timeout = 1800

        wait_timeout = 1800

        #连接响应超时时间

        connect-timeout = 60

        ###默认配置(插件、字符------

        default_authentication_plugin = mysql_native_password

        character-set-server = utf8

        sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

        innodb_log_file_size = 1024M

        #关闭InnoDB严格模式,防止报错 Row size too large (> 8126)

        innodb_strict_mode=0

        default-storage-engine=INNODB

        bind-address = 0.0.0.0

        #域名解析,设置为1之后就不能直接127.0.0.1连接数据库,需要root@127.0.0.1

        #skip_name_resolve = 1

        #忽略大小写,此项很重要(MySQL8之后的版本必须在初始化就设定此参数,初始化之后配置更改不生效)

        lower_case_table_names = 1

        ###主备相关------

        server-id = 25

        log-bin = backup.log

        #二进制日志格式,三种模式:statement语句>模式,row行模式,mixed混合模式

        binlog_format = mixed

        max_binlog_size = 1G

        expire_logs_days = 7

        #事务提交前产生的日志缓存

        binlog_cache_size = 16M

     #Auto_increment_increment和auto_increment_offset用于主-主服务器(master-to-master)复制,避免主键冲突

        #为了避免两台服务器同时做更新时自增长字段的值之间发生冲突。一般在主主同步配置时,需要将两台服务器的auto_increment_increment增长量都配置为2(根据从库节点数量配置),而要把auto_increment_offset分别配置为1(主库)和2(从库)

        #递增值

        auto_increment_increment = 2

        #初始值

        auto_increment_offset = 1

        #表示需要记录二进制日志的数据库

        binlog_do_db=cssp

        binlog_do_db=mysql

        #表示不需要记录二进制日志的数据库

        binlog_ignore_db=information_schema

        #忽略表

        replicate-wild-ignore-table=pva_db.pva_login_%

        replicate-wild-ignore-table=pva_db.pva_login_log

        #忽略错误代码(从库配置)

        slave-skip-errors = 1032,1062,126,1114,1146,1048,1396

        #自动清空不再需要中继日志(从库配置)

        relay-log-purge = 1

        ###系统资源相关------

        #接收连接请求队列

        back_log = 600

        #最大打开文件数(前提mysql用户需要调整最大打开文件数)

        open_files_limit = 10240

        #所有线程打开表数量

        table_open_cache = 512

        #处理请求包最大大小

        max_allowed_packet = 32M

        #临时表最大大小

        tmp_table_size = 512M

        #独立内存表所允许最大容量

        max_heap_table_size = 512M

        #用于索引块的缓冲区大小

        key_buffer_size = 64M

        #查询排序的缓冲区大小

        sort_buffer_size = 8M

        #读操作的缓冲区大小

        read_buffer_size = 8M

        #联表查询缓冲区大小

        join_buffer_size = 8M

        #批量数据插入缓存

        bulk_insert_buffer_size = 120M

        #保存索引以及原始数据的缓冲池(原则上最大为系统内存的 80%)

        innodb_buffer_pool_size = 2G

        #脏页比例,脏页占innodb_buffer_pool_size的比例时,触发刷脏页到磁盘(25~50)

        innodb_max_dirty_pages_pct = 30

        #事务提交 flush

        innodb_flush_log_at_trx_commit = 1

        #1,(默认值)每一次提交刷新日志到磁盘

        #2,先写入缓存,由系统设置每秒刷新日志到磁盘(可能丢失1~2秒的数据)

        ###多线程优化------

        #可重新被利用保存在缓存中的线程数量

        thread_cache_size = 300

        ###其他配置------

        #占用内存过高调整以下参数配置

        #table_definition_cache=400

        #open_files_limit = 2048

        #table_open_cache = 256

        #跳过密码表检查

        #skip-grant-tables

创建相关目录及权限配置

#mkdir  mysql-8.0.18/{log,tmp}

#mkdir  data

#useradd  mysql  -s  /sbin/nologin

#chown  -R  mysql.mysql  /project/mysql 

数据库初始化 

无密码初始化

#/project/mysql/mysql-8.0.18/bin/mysqld  --defaults-file=/etc/my.cnf  --user=mysql --initialize-insecure

有密码初始化

#/project/mysql/mysql-8.0.18/bin/mysqld  --defaults-file=/etc/my.cnf  --user=mysql  --initialize

启动数据库

#/project/mysql/mysql-8.0.18/bin/mysqld_safe  --defaults-file=/etc/my.cnf  --user=mysql  &

登录数据库

#/project/mysql/mysql-8.0.18/bin/mysql  -u  root  -p

修改密码

>alter  user  'root'@'localhost'  identified  with  mysql_native_password  by  'xxx';

>flush privileges;

配置MySQL环境变量

#vim  /etc/profile.d/mysqld.sh

            export MYSQL_HOME=/project/mysql/mysql-8.0.18

            export PATH=$MYSQL_HOME/bin:$MYSQL_HOME/lib:$PATH

#chmod  +x  /etc/profile.d/mysqld.sh

#source  /etc/profile.d/mysqld.sh

添加系统服务

#cp  -a  /project/mysql/mysql-8.0.18/support-files/mysql.server  /etc/init.d/mysqld.server

#chmod  +x  /etc/init.d/mysqld.server

开机自启

#chkconfig --add mysqld.server

#chkconfig --list mysqld.server

导出导入

导出

#mysql -e "show databases;" -uroot -p| grep -Ev "Database|information_schema|mysql"|xargs mysqldump -uroot -p --databases|gzip >./mysql_dump.sql.gz

导入

#nohup gunzip -f<./mysql_dump.sql.gz |mysql -u root -p>./nohup.out &

抛错

1,SQL导入

Mysql ERROR 1067: Invalid default value for 字段

原因分析

SQL_MODE 设置值的问题

解决方法:

修改配置sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

ONLY_FULL_GROUP_BY:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么将认为这个SQL是不合法的,因为列不在GROUP BY从句中

STRICT_TRANS_TABLES:在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做任何限制

NO_ZERO_IN_DATE:在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入'0000-00-00'。在非严格模式,可以接受该日期,但会生成警告。

NO_ZERO_DATE:在严格模式,不要将 '0000-00-00'做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告

ERROR_FOR_DIVISION_BY_ZERO:在严格模式,在INSERT或UPDATE过程中,如果被零除(或MOD(X,0)),则产生错误(否则为警告)。如果未给出该模式,被零除时MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作结果为NULL。

NO_AUTO_CREATE_USER:防止GRANT自动创建新用户,除非还指定了密码。

NO_ENGINE_SUBSTITUTION:如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常

2,SQL执行

[HY000][1418] This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)

原因分析

因为CREATE PROCEDURE, CREATE FUNCTION, ALTER PROCEDURE,ALTER FUNCTION,CALL, DROP PROCEDURE, DROP FUNCTION等语句都会被写进二进制日志,然后在从服务器上执行。但是,一个执行更新的不确定子程序(存储过程、函数、触发器)是不可重复的,在从服务器上执行(相对与主服务器是重复执行)可能会造成恢复的数据与原始数据不同,从服务器不同于主服务器的情况

解决方法

set global log_bin_trust_function_creators=TRUE;

主从配置

原理

MySQL 支持互为主从,主库通过 binlog 将执行的语句传给从库,具体的执行机构

      1,主库上的 dump thread,主库上的 binlog 只有在写入到硬盘之后才能通过 dump thread 传出

      2,从库上的 IO thread,接收主库的 dump thread 发过来的 binlog 并且生成 relay log(中继日志)

      3,从库上的 sql thread,执行 relay log 中的语句

注意事项

1,从库会向主库验证身份,需要在从库配置主库的连接信息(添加主库认证用户及密码)

2,在主库已存在数据的情况下,需要手动导出主库数据并导入进从库再开启主从复制,需保证各节点数据一致

3,主从数据库版本保持一致

4,主库开启二进制日志

5,server-id必须唯一

配置

添加主从认证用户

>CREATE USER '${username}'@'${IP}' IDENTIFIED with  mysql_native_password BY '${password}';

>grant  FILE,SELECT,REPLICATION SLAVE,REPLICATION CLIENT ON *.*  to  '${username}'@'${IP}';

>flush  privileges;

修改主从复制节点信息

> change master to MASTER_HOST='${IP}',MASTER_PORT=3306,MASTER_USER='${username}',MASTER_PASSWORD='${password}',MASTER_LOG_FILE='backup_log.000003',MASTER_LOG_POS=156;

master_log_file、master_log_pos 为主库节点中 show master status; 查询到的结果

 开启同步

>start slave;

>show  master  status\G

>show  slave  status\G

不停主库开启主从

使用备份导出-导入

mysqldump备份导出记录(change master to)"binlog"点和"pos"值写到结果中

#mysqldump -uroot -p --routines --single_transaction --master-data=2 --databases test > test.sql

–routines:导出存储过程和函数
–single_transaction:导出开始时设置事务隔离状态,并使用一致性快照开始事务。
–master-data:默认等于1,将dump起始(change master to)binlog点和pos值写到结果中,等于2是将change master to写到结果中并注释

mysql导入

#mysql  -uroot  -p  -e 'create  database  test;'

#mysql  -uroot  -p  test<./test.sql

备份文件查看binlog和pos值

#head -25 weibo.sql        #大概22行左右的位置

从库change master

mysql>change master to master_host='${IP}', 
    -> master_user='${USERNAME}', 
    -> master_password='${PASSWORD}', 
    -> master_log_file='mysql-bin.000001', 
    -> master_log_pos=107;

mysql>start  slave;

主从延迟

Seconds_Behind_Master: 从属服务器SQL线程和从属服务器I/O线程之间的时间差距,单位以秒计

1,提高slave端服务器配置

2,sync_binlog在slave端设置为0或直接禁用slave端的binlog二进制日志

3,slave端如果使用的存储引擎是innodb,innodb_flush_log_at_trx_commit = 2,=2表示事务提交写入系统缓存,=1表示事务提交写入系统硬盘

问题记录

1236

问题描述:日志读取错误,一般是因为主库存在原数据未同步到从库导致,或者检查sql(changel)有没有规范

解决方法:刷新日志,在从库重新配置主库节点信息

>flush logs;                                   #主库执行

>show master status\G                #主库执行并记录信息

>stop slave;                                  #从库执行

> change master to MASTER_HOST='${IP}',MASTER_PORT=3306,MASTER_USER='${username}',MASTER_PASSWORD='${password}',MASTER_LOG_FILE='backup_log.000004',MASTER_LOG_POS=156;

#MASTER_LOG_FILE、MASTER_LOG_POS根据主库节点重新 show master status\G信息修改

>start  slave;                               #从库执行

1062

问题描述:主键冲突,一般是因为主键字段id在主库之前的数据上加一的,但是从库中已经存在了这个加一后的值,所以发生了主键冲突,导致SQL线程发生错误

解决方法:跳过或者删除从库自己插入的那条数据

>stop slave;                                  #从库执行

>set global sql_slave_skip_counter=1;                     #从库执行,跳过当前执行sql

>start  slave;                               #从库执行

1593

问题描述:主从库的server-id冲突

解决方法:将sevrer-id改为不一致的值即可,记得重启服务进程

1032

问题描述:从库误删记录

解决方法:补齐从库所缺记录

>show slave status\G                         #从库执行,获取主库的binlog文件(Relay_Master_Log_File:mysql-binlog.000005)和position号 (Exec_Master_Log_Pos:1678)

 执行命令获取sql文件

#mysqlbinlog --start-position=1678 -vv --base64-output=DECODE-ROWS log/backup_log.000005 > /tmp/bin.sql                 #主库执行

打开文件检索关键字 1678 确认已记录该pos

翻到文件最后

根据上面信息可以得到主库执行sql 

sql:update

更新表名:test_102

更新字段:第二个字段,更新后的记录为:test

根据表结构,字段名可直接插入从库 

>insert into test_102 values ('04','test','23');                         #从库执行

再通过pt-slave-restart跳过错误即可,执行命令

#pt-slave-restart -uroot -pHdlh@2605                              #从库执行

如误删数据不重要,且数据太多,可以选择直接跳过报错的事务

记录报错起始的GTID号

执行sql

>stop slave;

>SET @@SESSION.GTID_NEXT= 'ANONYMOUS';

>begin;

>commit;

>SET GTID_NEXT=AUTOMATIC;

>start slave;

2003

问题描述:主库宕机

解决方法:启动主库服务进程

reset

在这里插入图片描述

mysql>stop slave;

mysql>reset slave;

mysql>start slave;

版本替换

二进制

备份my.cnf文件

#cp  /etc/my.cnf  /etc/my.cnf_bak

解压高版本安装包

#tar xzvf mysql-8.0.29-el7-x86_64.tar.gz

解压安装完不需要初始化数据库

修改MySQL数据库配置文件 /etc/my.cnf

        替换basedir路径为最新版本解压安装路径

        替换pid-file路径

        替换日志文件路径

        总之,数据文件datadir路径不变,其他安装文件、pid文件、日志文件路径都要修改成对应的新版本解压安装路径(新版本安装路径mkdir创建与之对应的目录并赋权mysql用户)

#vim  /etc/my.cnf

        [mysqld]

        basedir = /project/mysql/mysql-8.0.29

        datadir = /project/mysql/data

        pid-file = /project/mysql/mysql-8.0.29/mysqld.pid

        ###日志配置------

        log_error = /project/mysql/mysql-8.0.29/log/error.log

        slow_query_log_file = /project/mysql/mysql-8.0.29/log/slow.log

rpm包

备份my.cnf文件

#cp  /etc/my.cnf  /etc/my.cnf_bak

卸载低版本

#rpm -qa | grep -i mysql | xargs rpm -ev --nodeps

安装新版本

#rpm  -ivh  ./*.rpm  --force --nodeps

重启数据库

#systemctl  restart  mysql

验证

读写分离

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值