@zhangyy
2021-11-10T05:27:15.000000Z
字数 10583
阅读 432
MySQL系列
MySQL作为全球最受开发者欢迎的数据库,被广泛应用于各类场景中。数据MySQL 5.7版本已于近日正式发布,即日起,用户已可在各种云上在线创建MySQL 5.7版本的RDS。与社区版5.6版本相比,5.7版本性能最大提升3倍,并且新增了众多新特性,其中包括:支持JSON、GIS地理空间数据库,更便捷的SSL安全访问配置,InnoDB 的多项功能增强等多项新特性,更简化了数据库开发流程。
1. 性能优化:MySQL 5.7版本在性能提升方面做了很多改进,其中包括改进复制、重写了大部分解析器及优化器和成本模型以及临时表性能改进等。2. 改进并行复制:MySQL 5.6已经实现了库级别的并行复制,5.7版本中新增了slave_parallel_type参数,设置为LOGICAL_CLOCK时,开启基于组提交的并行复制,即一个组提交的事务可以实现并行回放,此外仍可通过slave_parallel_workers参数设置并行复制的工作进程数,并行复制在很大程度上解决了之前MySQL主从延迟的问题。3. 优化器重构MySQL 5.7重构了MySQL优化器,改进了解析器、优化器和成本模型,从而生成更合理的执行计划提高查询效率。基于成本的优化mysql系统库中新增server_cost和engine_cost表,存储成本估算相关参数,通过配置cost_value可以改变成本估算结果。优化器HintsMySQL 5.6通过设置optimizer_switch实现会话级的优化器策略调整,MySQL 5.7可以在语句上以类似注释的语法/*+ ... */加Hints改变优化器策略,优先级高于optimizer_switch设置,例如可以增加索引和join连接的Hints。l 查询重写插件 在server端接收到SQL后,查询重写插件可以按照用户设置的规则对其进行改写并执行;对于某些难以通过变更业务代码来优化的SQL,通过查询重写添加Hints或改写来优化这些SQL。4. 临时表改进新增参数innodb_temp_data_file_path,可配置独立的临时表空间,降低I/O开销;新增参数internal_tmp_disk_storage_engine,磁盘临时表可以使用InnoDB引擎,高并发时性能更好;临时表元数据不再存储于InnoDB系统表,存储在了IS下的innodb_temp_table_info,减少了数据字典的锁竞争;临时表及相关对象引入新的non-redo undo log,DML操作不记录redo,减少了大量的日志开销。5. 安全性增强MySQL 5.7被称为是MySQL 发布以来最安全的版本,因此这个版本做了很多提升安全性方面的改进:启动时默认创建SSL,RSA certificate和key文件;MySQL5.7开始安装完成,用户的密码空不能为空,不再支持mysql_old_password的认证插件,推荐使用mysql_native_password;支持设置任意密码有效期,支持手动锁定/解锁账户;支持安全模式安装数据库,逐步废弃mysql_install_db的安装方式使用 initialize代替;支持表空间加密,可通过安装keyring_file插件来启用该功能。灵活性更高6. 支持JSON随着非结构化数据存储需求的增长,MySQL 自5.7.8版本开始支持JSON,支持JSON后也使得MySQL兼具关系型数据库与非关系型数据库的优点,成为灵活性更高的数据库。MySQL 5.7支持原生的JSON类型,使用binary格式进行存储,可以快速查询文档元素,且提供一系列原生函数和路径表达式高效处理JSON字符,不需要遍历全部数据,此外结合虚拟列的功能可以对JSON中的部分数据进行索引以提升查询性能。7. GIS改进在5.7版本之前,MySQL对地理空间函数支持度有限,性能一般,所以一直没有获得广泛应用。但是目前随着LBS服务的需求越来越普遍,MySQL对GIS进行了大规模重构和优化,并将这些改进整合到了5.7版本中。5.7版本对GIS的改进:通过Boost Geometry库重构之前的地理空间数据的代码实现;增加球面举例的计算函数ST_Distance_Sphere等多种通用地图函数;InnoDB存储引擎原生支持地理空间数据类型;InnoDB存储引擎新增R树索引支持地理空间查询;8.更具易用性为了增加MySQL的易用性,以达到加速网络和大数据加载等操作进程,5.7版本改进了InnoDB 的可扩展性和临时表的性能。同时,MySQL5.7新增了SYS Schema系统库,可以直接查询目标信息而无需借助外部工具。而Performance Schema新增了35张表及大量的监控项,丰富了信息源。此外,复制方面做的一些降低复制维护难度和简化步骤的改进也极大地提升了MySQL5.7的易用性。
系统: CentOS7.9x64主机名:cat /etc/hosts------192.168.100.11 node01.flyfish.com192.168.100.12 node02.flyfish.com192.168.100.13 node03.flyfish.com192.168.100.14 node04.flyfish.com192.168.100.15 node05.flyfish.com192.168.100.16 node06.flyfish.com192.168.100.17 node07.flyfish.com192.168.100.18 node08.flyfish.com192.168.100.19 node09.flyfish.com-------本次只安装第一台 单机版本编译安装MySQL 5.7.x
1.系统磁盘:测试环境系统:----OS FS: root 分区 50g分两个区:/boot 512M/ 剩下全部swap 16GMySQL 分区:softvg:30 Gappvg:51 Gdatavg:52 Glogvg:53 Gbakvg:54 G-------OS:采用逻辑分区方式方便扩容/dev/sdb/dev/sdc/dev/sdd/dev/sde/dev/sdfpvcreate /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf pvsvgcreate appvg /dev/sdbvgcreate datavg /dev/sdcvgcreate logvg /dev/sddvgcreate bakvg /dev/sdevgcreate softvg /dev/sdfvgdisplayvgslvcreate -n softlv -L 30000M softvglvcreate -n mysqllv -L 50000M appvglvcreate -n datalv -L 50000M datavglvcreate -n loglv -L 50000M logvglvcreate -n baklv -L 49998M bakvglvdisplaylvsmkfs.xfs /dev/softvg/softlvmkfs.xfs /dev/appvg/mysqllvmkfs.xfs /dev/datavg/datalvmkfs.xfs /dev/logvg/loglvmkfs.xfs /dev/bakvg/baklvmkdir -p /mysql/appmkdir -p /mysql/datamkdir -p /mysql/logmkdir -p /mysql/backupmkdir -p /softecho "/dev/appvg/mysqllv /mysql/app xfs defaults 0 0" >> /etc/fstabecho "/dev/datavg/datalv /mysql/data xfs defaults 0 0" >> /etc/fstabecho "/dev/logvg/loglv /mysql/log xfs defaults 0 0" >> /etc/fstabecho "/dev/bakvg/baklv /mysql/backup xfs defaults 0 0" >> /etc/fstabecho "/dev/softvg/softlv /soft xfs defaults 0 0" >> /etc/fstabcat /etc/fstabmount /mysql/appmount /mysql/datamount /mysql/logmount /mysql/backupmount /softcat /etc/hostsecho "export LANG=en_US.UTF8" >> ~/.bash_profileecho "export LANG=en_US.UTF8" >> /etc/profilecat ~/.bash_profilesource ~/.bash_profilemount /dev/cdrom /mntcd /etc/yum.repos.dmkdir bkmv public-yum-ol7.repo bk/echo "[EL7]" >> itpux.repoecho "name = linux 7.5 dvd" >> itpux.repoecho "baseurl=file:///mnt" >> itpux.repoecho "gpgcheck=0" >> itpux.repoecho "enabled=1" >> itpux.reposystemctl set-default multi-user.targetsystemctl get-defaultecho "* soft memlock 300000" >> /etc/security/limits.confecho "* hard memlock 300000" >> /etc/security/limits.confecho "vm.nr_hugepages=150" >> /etc/sysctl.confecho "vm.swappiness=10" >> /etc/sysctl.confecho "vm.min_free_kbytes=51200" >> /etc/sysctl.confecho "#vm.min_free_kbytes=512000" >> /etc/sysctl.confsysctl -pgrep "net.ipv4.tcp_keepalive_time = 30" /etc/sysctl.confif [ $? != 0 ]thencat <<EOF>> /etc/sysctl.confnet.ipv4.tcp_max_tw_buckets = 6000net.ipv4.ip_local_port_range = 1024 65000net.ipv4.tcp_tw_recycle = 0net.ipv4.tcp_tw_reuse = 1net.core.somaxconn = 262144net.core.netdev_max_backlog = 262144net.ipv4.tcp_max_orphans = 262144net.ipv4.tcp_max_syn_backlog = 262144net.ipv4.tcp_synack_retries = 2net.ipv4.tcp_syn_retries = 1net.ipv4.tcp_fin_timeout = 1net.ipv4.tcp_keepalive_time = 30net.ipv4.tcp_keepalive_probes = 6net.ipv4.tcp_keepalive_intvl = 5net.ipv4.tcp_timestamps = 0EOFsed -i 's/net.bridge.bridge-nf-call-ip6tables =0/#net.bridge.bridge-nf-call-ip6tables = 0/g' /etc/sysctl.confsed -i 's/net.bridge.bridge-nf-call-iptables = 0/#net.bridge.bridge-nf-call-iptables = 0/g' /etc/sysctl.confsed -i 's/net.bridge.bridge-nf-call-arptables = 0/#net.bridge.bridge-nf-call-arptables = 0/g' /etc/sysctl.conffisysctl -pecho "* - nproc 65535" > /etc/security/limits.d/90-nproc.confecho "SELINUX=disable" >/etc/selinux/configecho "#SELINUXTYPE=trageted" >> /etc/selinux/configcat /etc/selinux/configsetenforce 0systemctl status firewalld.servicesystemctl stop firewalld.servicesystemctl disable firewalld.serviceecho "if test -f /sys/kernel/mm/transparent_hugepage/enabled" then >> /etc/rc.d/rc.localecho "echo never > /sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.d/rc.localecho "fi">> /etc/rc.d/rc.localecho "if test -f /sys/kernel/mm/transparent_hugepage/defrag; then" >> /etc/rc.d/rc.localecho "echo never > /sys/kernel/mm/transparent_hugepage/defrag">> /etc/rc.d/rc.localecho "fi">> /etc/rc.d/rc.localchmod +x /etc/rc.d/rc.localecho "session required pam_limits.so" >> /etc/pam.d/logincat /etc/pam.d/loginecho "* soft nproc 65535" >> /etc/security/limits.confecho "* hard nproc 65535" >> /etc/security/limits.confecho "* soft nofile 65535" >> /etc/security/limits.confecho "* hard nofile 65535" >> /etc/security/limits.confecho "* soft stack 65535" >> /etc/security/limits.confecho "* hard stack 65535" >> /etc/security/limits.confcat /etc/security/limits.confsystemctl stop avahi-daemon.socket avahi-daemon.servicesystemctl disable avahi-daemon.socket avahi-daemon.servicecat /sys/block/sd*/queue/scheduler#--sas/statecho 'deadline' > /sys/block/sdb/queue/schedulerecho 'deadline' > /sys/block/sdc/queue/schedulerecho 'deadline' > /sys/block/sdd/queue/schedulerecho 'deadline' > /sys/block/sde/queue/schedulerecho 'deadline' > /sys/block/sdf/queue/scheduler#--ssdecho 'NOOP' > /sys/block/sd*/queue/scheduler--开启后生效(下面两部分)vi /etc/rc.local#减少预读echo '16' > /sys/block/sdb/queue/read_ahead_kbecho '16' > /sys/block/sdc/queue/read_ahead_kbecho '16' > /sys/block/sdd/queue/read_ahead_kbecho '16' > /sys/block/sde/queue/read_ahead_kbecho '16' > /sys/block/sdf/queue/read_ahead_kb#增大队列echo '512' > /sys/block/sdb/queue/nr_requestsecho '512' > /sys/block/sdc/queue/nr_requestsecho '512' > /sys/block/sdd/queue/nr_requestsecho '512' > /sys/block/sde/queue/nr_requestsecho '512' > /sys/block/sdf/queue/nr_requestscp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtimehwclock禁用 NUMA:vi /etc/default/grubGRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet numa=off"然后执行:grub2-mkconfig -o /etc/grub2.cfgnumastatnumactl --shownumactl --hardwareshutdown -r now克隆虚拟机:rm -f /etc/udev/rules.d/70-persistent-net.ruleshostname itpuxdb01echo "itpuxdb01" > /etc/hostnamevi /etc/sysconfig/network-scripts/ifcfg-ens34 改 IP、删 UUIDreboot
上传软件到的机器# install the basie libmount /dev/cdrom /mntyum remove mariadb* -yyum install gcc gcc-c++ perl-DBD-MySQL ncurses-devel.x86_64 cmake.x86_64 libaio.x86_64 bison.x86_64 gcc-c++.x86_64 bind-utils wget curl curl-devel perl openssh-clients setuptool sysstat make redhat-lsb* lrzsz

groupadd mysqluseradd -r -g mysql -s /bin/false mysqlcd /softtar xvf /soft/mysql-5.7.36-linux-glibc2.12-x86_64.tar -C /mysql/app/cd /mysql/app/tar zxvf /soft/mysql-5.7.36-linux-glibc2.12-x86_64.tar.gzmv /mysql/app/mysql-5.7.36-linux-glibc2.12-x86_64 mysqlecho "export PATH=\$PATH:$HOME/bin:/mysql/app/mysql/bin">> /etc/profilesource /etc/profile

# add mysql account,create the basic directorymkdir -p /mysql/data/3306/datamkdir -p /mysql/log/3306/binlogmkdir -p /mysql/log/3306/relaylogmkdir -p /mysql/backup/backup-dbmkdir -p /mysql/backup/backup-tmpmkdir -p /mysql/backup/backup-binlogchown -R mysql:mysql /mysql/

# init databases -- my.cnf 每台机都不同rm -rf /mysql/data/3306/data/cp /soft/my.cnf /mysql/data/3306//mysql/app/mysql/bin/mysqld --defaults-file=/mysql/data/3306/my.cnf --initialize --user=mysql --basedir=/mysql/app/mysql --datadir=/mysql/data/3306/dataln -sf /mysql/data/3306/mysql.sock /tmp/mysql.sock# remove default my.cnfrm -f /etc/my.cnfrm -rf /etc/my.cnf.d# set the default password/mysql/app/mysql/bin/mysqld_safe --defaults-file=/mysql/data/3306/my.cnf --skip-grant-tables --skip-networking &/mysql/app/mysql/bin/mysql -uroot --password='' --socket='/mysql/data/3306/mysql.sock' -e " update mysql.user set authentication_string=password('root') where user='root' and Host = 'localhost'; flush privileges;"/mysql/app/mysql/bin/mysql -uroot --password='root' --connect-expired-password --socket='/mysql/data/3306/mysql.sock' -e " alter user 'root'@'localhost' identified by 'root';"/mysql/app/mysql/bin/mysql -uroot --password='root' --socket='/mysql/data/3306/mysql.sock' -e "create USER 'root'@'%' IDENTIFIED BY 'root';"/mysql/app/mysql/bin/mysql -uroot --password='root' --socket='/mysql/data/3306/mysql.sock' -e "grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;flush privileges;"/mysql/app/mysql/bin/mysql -uroot --password='root' --socket='/mysql/data/3306/mysql.sock' -e " create database t; use t;create table t1 select 1 as a; select * from t1;drop database t;"echo "/mysql/app/mysql/bin/mysqld_safe --defaults-file=/mysql/data/3306/my.cnf --user=mysql &" > /mysql/data/3306/mysql.startchown mysql:mysql /mysql/data/3306/mysql.startchmod +x /mysql/data/3306/mysql.start
修改 mysql.server 文件cd /mysql/app/mysql/support-files/mv mysql.server mysql.server.bakcp /soft/mysql.server /mysql/app/mysql/support-files/chown mysql:mysql /mysql/app/mysql/support-files/mysql.serverchmod +x /mysql/app/mysql/support-files/mysql.servercp /mysql/app/mysql/support-files/mysql.server /mysql/app/mysql/bin/mysqlservicemysqlservice status

将脚本和安装软件 scp 到 N 台服务器,然后 ssh ip 地址 " sh /soft/init_linux.sh; sh /soft/install_mysql.sh;",用后台批量进程来安装。---配置启动脚本-第 1 步: # set the auto start on linux server startedcp /soft/mysqld.service /usr/lib/systemd/system/---配置启动脚本-第 2 步(开机自动启动):systemctl daemon-reloadsystemctl stop mysqldsystemctl start mysqldsystemctl enable mysqldsystemctl status mysqld-- 登录测试mysql -uroot -proot -e "show databases"
