mysql(1)安装及单机多实例安装及基本参数配置和升级以及开启ssl认证
1.linux上的mysql的安装
1.1mysql的安装(5.6)
查看是否安装过mysql :rpm -qa |grep mysql*
2)卸载mysql
rpm -e --nodeps 上述查询的mysql版本名
再次使用mysql :rpm -qa |grep mysql* ,没有了就卸载完成
3)从网上下载linux版的mysql
https://dev.mysql.com/downloads/mysql/5.7.html#downloads
4)文件的上传 这里使用的是SecureCRT(这个的安装在linux中有)
alt+p 打开上传窗口 ,拖拽上传
5)mysql的安装
在安装文件中有一个install文件,按照那个安装即可
6)安装步骤解析如下
groupadd mysql //新建用户组
useradd -r -g mysql mysql//表示在-g指定用户组 -r为mysql下新建用户为mysql
cd /usr/local //切换目录
tar zxvf 文件 //解压文件到当前目录
ln -s 被解压文件 mysql //给文件添加软链接,删除 rm 或者unlink 链接名
cd mysql //切换目录
chown -R mysql . //指定. 表示当前文件下,-R 表示遍历,所有者是mysql
chgrp -R mysql . //指定. 表示当前文件下,-R 表示遍历,所属组是mysql
scripts/mysql_install_db --user=mysql //初始化,初始化完后在data目录下会有文件,为初始化前是空的,根据的是my.cnf进行相应的初始化
chown -R root .
chown -R mysql data
./mysqld_safe --user=mysql & // & 表示后台运行 user=mysql表示用户 ,mysqld_safe是一个守护进程,假如mysql掉线,那么mysqld_safe会相应的启动mysql进程 回车结束
./mysqladmin shutdown //mysql关闭
./mysqld --user=mysql & //也能启动mysql 回车结束
cp support-files/mysql.server /etc/init.d/mysql.server //
/etc/init.d/mysql.server start // 设置上述后 然后这样启动
使用 ps -ef | grep mysql出现如下表示正常开启了
。。。
root 25372 1 0 06:48 pts/1 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/fatale.pid
mysql 25474 25372 9 06:48 pts/1 00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/fatale.err --pid-file=/usr/local/mysql/data/fatale.pid
root 25503 25103 0 06:48 pts/1 00:00:00 grep mysql
//关闭
/etc/init.d/mysql.server stop
使用 ps -ef | grep mysql没有如下表示正常关闭了
root
25372 1 0 06:48 pts/1 00:00:00 /bin/sh
/usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data
--pid-file=/usr/local/mysql/data/fatale.pid
mysql 25474 25372 9
06:48 pts/1 00:00:00 /usr/local/mysql/bin/mysqld
--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
--plugin-dir=/usr/local/mysql/lib/plugin --user=mysql
--log-error=/usr/local/mysql/data/fatale.err
--pid-file=/usr/local/mysql/data/fatale.pid
root 25503 25103 0 06:48 pts/1 00:00:00 grep mysql
7)添加到服务
chkconfig --list 查看所有服务 ,chkconfig命令(检查、设置系统的各种服务),假如没有 mysql.server ,那么需要添加 使用 chkconfig --add ./mysql.server ( ./表示当前文件夹),再次使用上述查看 如mysql.server 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭 ;含义在linux中有。如果在1345下面的话会自动启动,默认是运行在3 6表示重启export PATH=/usr/local/mysql/bin:$PATH 添加到环境变量中,,方便使用, 可以使用echo $PATH命令查看,假如添加成功,会有相应显示,$PATH 表示的是/etc/profile下,使用source /etc/profile立即生效,但是关闭终端后,环境变量失效,可以将环境变量配置放在/etc/bash.bashrc中,然后source /etc/bash.bashrc,关闭终端后生效,移除chkconfig --del ./mysql.server
8)查看版本
mysql --version 或者 mysql -V ,查看当前使用的mysql版本, 假如需要改启动的版本,那么就需要改/etc/profile下配置的顺序。
9)设置密码和登录以及退出
mysql -h localhost -u root -p密码 -P -e;密码一般不要写出 直接回车然后有一个输入密码的输入栏,这样较为安全
mysql -u 用户名 密码没有(5.6可以没有密码)采用的是默认的-h localhost;
修改密码mysqladmin -u root -p password,没有密码回车即可(有密码输入密码),然后输入新的密码,验证密码,下次登录就需要密码了,登入如下 mysql -u root -p 回车 输入密码即可,也可以是用 set password=password("")的password函数来设定,但是在5.7直接可以写成set password=" ";
退出quit 或者exit
10)关闭mysql服务器
./mysqladmin -u root -p shutdown 回车然后输入密码
1.2.linux上的mysql的安装(5.7版)
1)5.7和5.6的异同:
5.7的安装是与5.6不同,5.6初始状态是没有密码的,但是5.7默认是有密码的,他的密码是随机产生的,在初始化的时候会产生和显示,也可以在错误日志文件中查看
5.7较5.6多了sys数据库,少了test数据库,test数据库是任何人都可以访问的,所以建议删除,sys是向oracle看齐的
2)安装
ln -s之前与5.6一样
mkdir mysql-files
chmod 770 mysql-files/
chown -R mysql .
chgrp -R mysql .
bin/mysqld --initialize --user=mysql
chown -R root .
chown -R mysql data mysql-files/
bin/mysqld_safe --user=mysql &
初始密码bin/mysqld --initialize --user=mysql后会随机的产生
登录 mysql -u root -p密码(建议不要直接写出,回车再输入) (默认的-h是localhost)登录后设置密码 set password=“。。。。”;当然也可以按上述的mysqladmin 来改
3)mysql读取配置文件的优先级
mysql --help --v | grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT, /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 遵循参数覆盖的原则, 同样的配置,后面的会覆盖前面的配置
备注:使用`mysqld --help -vv | grep my.cnf `查看mysql的配置文件读取顺序,后读取的`my.cnf`中的配置,如果有相同项,会覆盖之前的配置 ,使用`--defaults-files`可指定配置文件。
4)安装多版本的mysql
//安装多个mysql
//下面是同版本安装,多版本安装可以添加basedir = /usr/local/mysql # basedir定义使用了5.7的mysql版本,这个参数
cat /etc/my.cnf;
//my.cnf配置文件,client这个标签如果配置了用户和密码并且[mysqld_multi]下没有配置用户名密码,则mysqld_multi stop时, 会使用这个密码,如果没有精确的匹配,则匹配[client]标签
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
log = /var/log/mysqld_multi.log
user = multi_admin
//官方文档中写的password,但是存在bug,需要改成pass,写成password,start时正常,stop时,会报错误
pass = 123
//mysqld后面的数字为GNR, 是该实例的标识
[mysqld1]
server-id = 11
socket = /tmp/mysql.sock1
port = 3306
bind_address = 0.0.0.0 //按需配置 默认运行访问的地址
datadir = /data1
user = mysql
innodb_buffer_pool_size = 32M
skip_name_resolve = 1
log_error = error1.log
pid-file = /data1/mysql.pid1
[mysqld2]
server-id = 12
socket = /tmp/mysql.sock2
port = 3307
bind_address = 0.0.0.0 //按需配置,默认运行访问的地址
datadir = /data2
user = mysql
innodb_buffer_pool_size = 32M
skip_name_resolve = 1
log_error = error2.log
pid-file = /data2/mysql.pid2
mkdir /data1;
mkdir /data2;
chown mysql.mysql /data{1..2};
mysqld --initialize --user=mysql --datadir=/data1 --explicit_defaults_for_timestamp=1;
//一些日志输出,并提示临时密码,下同
mysqld --initialize --user=mysql --datadir=/data2 --explicit_defaults_for_timestamp=1;
cp /usr/local/mysql/support-files/mysqld_multi.server /etc/init.d/mysqld_multid ;
//拷贝启动脚本,方便自启
chkconfig mysqld_multid on;
mysqld_multi start;//开启所有
mysqld_multi report;
mysql -u root -S /tmp/mysql.sock1 -p -P3306 ;//使用-S /tmp/mysql.sock1 进行登录 ,
//登录后进行如下操作
set password =“密码”//修改密码
mysql -u root -S /tmp/mysql.sock2 -p -P3307;
//登录后进行如下操作
set password =“密码”//修改密码
停止mysql实例
multi_admin用户的作用
通过[官方文档](http://dev.mysql.com/doc/refman/5.7/en/mysqld-multi.html)中我们看到,`multi_admin'@'localhost'这个用户主要的作用是用来关闭数据库实例,因为文档中只授权了SHUTDOWN权限。所以在[mysqld_multi]标签下,我们需要配置user和password(注意5.7.9中是pass)来进行关闭数据库实例。
//设置如下两个后才能使用mysqld_multi stop关闭create user 'multi_admin'@'localhost' identified by '123'; 这里的账号密码需要与上述的【mysqld_multi】一致
create user 'multi_admin'@'localhost' identified by '123';
grant shutdown on *.* to 'multi_admin'@'localhost';
mysqld_multi stop 1 //关闭1
mysqld_multi start 1 //开启1
show variables like "port" //查看端口
show variables like "socket";//查看socket
show variables like "datadir";//查看datadir
3. 安装失败的原因:
假如安装错误会在data文件夹中的fatale.err中看到错误。 可能的原因:安装了其它版本的mysql,可能my.cnf的文件导致启动mysql是以原来配置的文件启动,路径不对所以启动失败,也可能mysql_data文件的权限设置不为mysql(所有者) mysql(所属组),没有权限。
备注:innodb_log_group_home_dir,datadir,innodb_undo_directory 的权限必须是 mysql mysql的权限,这是因为我们的是mysql用户,假如是root权限,那么mysql将没有权限
4. my.cnf配置文件的参数
除了可以读取my.cnf 还可以读取my.ini文件
datadir 存储路径 默认在 mysql的data下面 这个后面可以改
undo 设置后是不可以改的
innodb_log_file_size = 4G 这个值很重要 ,大了恢复很慢。小了可能空间不足,默认的是48M,这样明显不足,自己的电脑不要去4g 可能空间不够 产生write错误。
参数假如过期了,那么会告诉你这个参数已经过期了,会有一个提示。
//copy别人的最优配置,免密码登录,这是其中的一种方式,但是不安全 [client] user=root //按实际情况修改 password=12345678 //按实际情况修改 [mysqld] ########basic settings######## server-id = 11 port = 3306 user = mysql bind_address = 10.166.224.32 //按实际情况修改
#autocommit 默认自动提交,是在5.6及之后添加的这个参数,oracle不是默认自动提交,5.6中先要注释这个参数才能安装成功,安装后打开,0表示不自动提交,自动提交可以设置为1 autocommit = 0 character_set_server=utf8mb4 skip_name_resolve = 1 max_connections = 800 max_connect_errors = 1000
#数据分离这里是没有进行分开的,在线上的环境中是分离的 datadir = /data/mysql_data transaction_isolation = READ-COMMITTED explicit_defaults_for_timestamp = 1 join_buffer_size = 134217728 tmp_table_size = 67108864 tmpdir = /tmp max_allowed_packet = 16777216 sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER" interactive_timeout = 1800 wait_timeout = 1800 read_buffer_size = 16777216 read_rnd_buffer_size = 33554432 sort_buffer_size = 33554432 ########log settings########
#日志文件地址设置 log_error = error.log slow_query_log = 1 slow_query_log_file = slow.log log_queries_not_using_indexes = 1 log_slow_admin_statements = 1 log_slow_slave_statements = 1 log_throttle_queries_not_using_indexes = 10 expire_logs_days = 90 long_query_time = 2 min_examined_row_limit = 100 ########replication settings######## master_info_repository = TABLE relay_log_info_repository = TABLE log_bin = bin.log sync_binlog = 1 gtid_mode = on enforce_gtid_consistency = 1 log_slave_updates binlog_format = row relay_log = relay.log relay_log_recovery = 1 binlog_gtid_simple_recovery = 1 slave_skip_errors = ddl_exist_errors ########innodb settings######## innodb_page_size = 8192
#一般设置为服务器内存的75% 80% 或者90%(内存很大的情况下) 一般建议75% innodb_buffer_pool_size = 6G innodb_buffer_pool_instances = 8 innodb_buffer_pool_load_at_startup = 1 innodb_buffer_pool_dump_at_shutdown = 1 innodb_lru_scan_depth = 2000 innodb_lock_wait_timeout = 5 innodb_io_capacity = 4000 innodb_io_capacity_max = 8000 innodb_flush_method = O_DIRECT innodb_file_format = Barracuda innodb_file_format_max = Barracuda innodb_log_group_home_dir = /redolog/ //按实际情况修改 innodb_undo_directory = /undolog/ //按实际情况修改 innodb_undo_logs = 128 innodb_undo_tablespaces = 3 innodb_flush_neighbors = 1 innodb_log_file_size = 4G innodb_log_buffer_size = 16777216 innodb_purge_threads = 4 innodb_large_prefix = 1 innodb_thread_concurrency = 64 innodb_print_all_deadlocks = 1 innodb_strict_mode = 1 innodb_sort_buffer_size = 67108864 ########semi sync replication settings######## plugin_dir=/usr/local/mysql/lib/plugin //按实际情况修改 plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" loose_rpl_semi_sync_master_enabled = 1 loose_rpl_semi_sync_slave_enabled = 1 loose_rpl_semi_sync_master_timeout = 5000 #备注如下5.7的配置可以写在一起,因为mysql对配置文件本身就具有选择性 [mysqld-5.7] innodb_buffer_pool_dump_pct = 40 innodb_page_cleaners = 4 innodb_undo_log_truncate = 1 innodb_max_undo_log_size = 2G//回滚日志 innodb_purge_rseg_truncate_frequency = 128 binlog_gtid_simple_recovery=1 log_timestamps=system transaction_write_set_extraction=MURMUR32 show_compatibility_56=on
在启动的时候我们可以自己通过-- defaults-file=#来指定配置文件而不使用默认的配置文件
假如想查看mysql的配置,那么可以在进入mysql后使用show variables命令可以查看,mysql没有隐藏参数,这个不像oracle
参数可分为全局和会话,可修改与不可修改,全局需要加上global,例如 set global 参数 =值,会话级别只对当前会话有效, 例如set 【session】 autocommit=1;中间可以省略session,例如需要全局的话需要 set global autocommit=1;这样去设置,这样设置不会被保存(不能持久化),重启后又是采取默认值(重启后继续需要做配置的修改),只会对以后连接的有效,对现在已经打开的无效。查看可以使用show 【global/session】 【variables 】 【like pattern】 变量名 来查看。
备注:
innodb_log_file_size = 4G :做实验可以更改的小点,线上环境推荐用4G,以前5.5和5.1等版本之所以官方给的值很小,是因为太大后有bug,现在bug已经修复
innodb_undo_logs = 128和innodb_undo_tablespaces = 3建议在安装之前就确定好该值,后续修改比较麻烦
[mysqld],[mysqld-5.7]这种tag表明了下面的配置在什么版本下才生效,[mysqld]下均生效
autocommit,这个参数在5.5.X以后才有,安装5.6.X的时候要注意先把该参数注释掉,等安装完成后,再行打开, 5.7.X无需预先注释
datadir, innodb_log_group_home_dir, innodb_undo_directory一定要注意他的权限是 mysql:mysql
5.mysql的升级
将软连接更改一下,需要安装5.7之后,然后将前面新建的mysql软连接切换到新解压的目录,然后切换数据库目录,一般来说切换数据库我们直接可以使用datadir设置来切换,数据库data一般来说是兼容的,但是4.0和4.1是不兼容,但是那样更换数据库,会产生很多的警告信息,所以还需要使用mysql_upgrade命令来升级mysql的数据库的版本,需要密码 ,如mysqld_upgrade -p123456,升级后会将老版本的数据库文件格式升级为新版本的数据库文件格式,包括sys也是可见的,源数据的修复等,但是假如不加参数,那么会重新设计所有表,非常的慢,加参数-s,表示只更新系统表,--force表示即使是更新了我也要再次更新,通常来说数据是不需要升级的,只升级系统表。但是升级后还是有好处的,性能会有一定的提示。假如需要版本回退,-s的情况下,只需要将mysql这个文件恢复一下就可以了,在升级之前想copy备份一分,便于回滚。只要系统库是以前的版本就可以了,这样就可以回退了。当然可以用mysqldump,但是比较慢。
6.windows上安装
https://www.cnblogs.com/fnlingnzb-learner/p/6009153.html ,写的比较详细。
7.查看是否支持ssl和启用证书
show variables like "%ssl%";
have_openssl DISABLED # SSL没有开启
have_ssl DISABLED
mysql_ssl_rsa_setup --datadir=/data1 --user=mysql --uid=mysql //bin目录下,开启ssl
cd /data1
ll | grep pem
ca-key.pem #ca 私钥
ca.pem # ca自签证书
client-cert.pem #客户端证书文件
client-key.pem #客户端私钥文件
private_key.pem #用于密钥交换的公钥
public_key.pem #用户密钥交换的私钥
server-cert.pem #服务器端证书文件
server-key.pem #服务器端私钥文件
mysql -u root -S /tmp/mysql.sock1 -p -P3306 --ssl-mode=disable#不会报错
show variables like "%ssl%";
have_openssl yes 表示已经开启
server-cert.pem -- 公钥文件
server-key.pem -- 私钥文件
create user 'slave'@'%' identified by '123' require ssl; -- 强制使用证书认证
require值:
ssl_option
SSL: 不认证客户端,客户端不需要提供证书
X509: 客户端必须发送一个有效的X509证书
issuer: 客户端的证书是否是服务器所配置的CA颁发的(在我们场景下是ca_cert.cer颁发的证书)
subject: 认证证书的subject(关于证书的subject在之前的文章有介绍)
cipher: 指定加密算法
grant all on *.* to 'slave'@'192.168.133.1' identified by 'ASDF123asdf' require ssl; -- 强制使用证书认证
mysql -u 'slave -h 192.168.133.1 -P 3307 -p --ssl-mode=disable #在5.6中强制使用ssl后会报错
备注:如果用户是采用本地localhost或者sock连接数据库,那么不会使用SSL方式了
mysql -u 'slave -h 192.168.133.1 -p --ssl-cert=./client-cert.pem --ssl-key=./client-key.pem --ssl-ca=./
ca.pem
mysql> \s -- status
--------------
mysql Ver 14.14 Distrib 5.7.23, for linux-glibc2.12 (x86_64) using EditLine wrapper
Connection id: 7
Current database: table //当前表
Current user: root@localhost //用户
SSL: Not in use //没有使用ssl
Current pager: stdout
Using outfile: ''
Using delimiter: ; //结束符
Server version: 5.7.23 MySQL Community Server (GPL)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /tmp/mysql.sock
Uptime: 5 hours 2 min 54 sec
Threads: 3 Questions: 812 Slow queries: 0 Opens: 278 Flush tables: 1 Open tables: 235 Queries per second avg: 0.044
//scp 基于ssh 将一个文件拷贝到另一个电脑上
scp client-cert.pem client-key.pem root@172.18.14.41:~/
//查看连接状态
show status like '%connect%'