Linux下安装mysql教程
Linux下安装mysql
-
到mysql官网下载mysql编译好的二进制安装包,在下载页面Select Platform:选项选择linux-generic,然后把页面拉到底部,64位系统下载Linux - Generic (glibc 2.5) (x86, 64-bit),32位系统下载Linux - Generic (glibc 2.5) (x86, 32-bit)
安装前准备:
1.先检查Linux中是否存在mysql rpm -qa|grep mysql
2:如果存在,请先执行卸载命令:rpm -e --nodeps mysql-libs --nodeps代表:可能其他地方有依赖mysql,这里强制卸载
3:检查 /tmp文件夹权限,由于mysql安装过程中,会通过mysql用户在/tmp目录下新建tmp_db文件,所以请给/tmp较大的权限
chmod -R 777 /tmp
4:检查各个mysql文件夹是否删除干净
find / -name mysql
结果如下:
/var/lib/mysql
/usr/local/mysql
/usr/lib/mysql
/usr/include/mysql
命令删除:
rm -fr /usr/lib/mysql
rm -fr /usr/include/mysql
注意:卸载后/var/lib/mysql中的数据及/etc/my.cnf不会删除,如果确定没用后就手工删除
rm -f /etc/my.cnf
rm -fr /var/lib/mysql
删除mysql用户及用户组
userdel mysql
groupdel mysql
MySQL正式安装和相关设置(这里以mysql8.0.11为例)
1:上传压缩包到linux
解压压缩包:
tar -zxvf mysql-8.0.11-linux-glibc2.12-i686.tar.gz
# 移动解压后的文件夹至/usr/local
mv /usr/local/src/mysql-8.0.11-linux-glibc2.12-x86_64 /usr/local/
# 重命名
mv ./mysql-8.0.11-linux-glibc2.12-x86_64 mysql-8.0
# 创建文件夹data,存储文件;
cd /usr/local/mysql-8.0/ mkdir ./data
2 创建用户及用户组
# 用户组 groupadd mysql # 用户 (用户名/密码) useradd -g mysql mysql
3、授权
chown -R mysql.mysql /usr/local/mysql-8.0/ # 亲测 或 chown -R mysql . chgrp -R mysql .
4 初始化数据库
# 查看当前所在目录 pwd # 若显示/usr/local/mysql-8.0,请继续执行,否则请先进入此目录/usr/local/mysql-8.0 # 初始化 注意查看是否存在相关目录,若不存在,请新建 ./bin/mysqld --user=mysql --basedir=/usr/local/mysql-8.0/ --datadir=/usr/local/mysql-8.0/data/ --initialize ; # 亲测 或 ./bin/mysql --user=mysql --basedir=/usr/local/mysql-8.0/ --datadir=/usr/local/mysql-8.0/data/ --initialize ;
生成的临时密码:
5 Mysql配置
以下按需配置:
vi /etc/my.cnf
[client] port = 3306 socket = /tmp/mysql.sock
[mysqld] #Mysql服务的唯一编号 每个mysql服务Id需唯一 server-id = 1 #服务端口号 默认3306 port = 3306 #mysql安装根目录 basedir = /usr/local/mysql #mysql数据文件所在位置 datadir = /usr/local/mysql/data #pid pid-file = /usr/local/mysql/mysql.pid #设置socke文件所在目录 socket = /tmp/mysql.sock #设置临时目录 tmpdir = /tmp # 用户 user = mysql # 允许访问的IP网段 bind-address = 0.0.0.0 # 跳过密码登录 #skip-grant-tables #主要用于MyISAM存储引擎,如果多台服务器连接一个数据库则建议注释下面内容 skip-external-locking #只能用IP地址检查客户端的登录,不用主机名 skip_name_resolve = 1 #事务隔离级别,默认为可重复读,mysql默认可重复读级别(此级别下可能参数很多间隙锁,影响性能) transaction_isolation = READ-COMMITTED #数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节) character-set-server = utf8mb4 #数据库字符集对应一些排序等规则,注意要和character-set-server对应 collation-server = utf8mb4_general_ci #设置client连接mysql时的字符集,防止乱码 init_connect='SET NAMES utf8mb4' #是否对sql语句大小写敏感,1表示不敏感 lower_case_table_names = 1 #最大连接数 max_connections = 400 #最大错误连接数 max_connect_errors = 1000 #TIMESTAMP如果没有显示声明NOT NULL,允许NULL值 explicit_defaults_for_timestamp = true #SQL数据包发送的大小,如果有BLOB对象建议修改成1G max_allowed_packet = 128M #MySQL连接闲置超过一定时间后(单位:秒)将会被强行关闭 #MySQL默认的wait_timeout 值为8个小时, interactive_timeout参数需要同时配置才能生效 interactive_timeout = 1800 wait_timeout = 1800 #内部内存临时表的最大值 ,设置成128M。 #比如大数据量的group by ,order by时可能用到临时表, #超过了这个值将写入磁盘,系统IO压力增大 tmp_table_size = 134217728 max_heap_table_size = 134217728 #禁用mysql的缓存查询结果集功能 #后期根据业务情况测试决定是否开启 #大部分情况下关闭下面两项 query_cache_size = 0 query_cache_type = 0 #数据库错误日志文件 log_error = error.log #慢查询sql日志设置 slow_query_log = 1 slow_query_log_file = slow.log #检查未使用到索引的sql log_queries_not_using_indexes = 1 #针对log_queries_not_using_indexes开启后,记录慢sql的频次、每分钟记录的条数 log_throttle_queries_not_using_indexes = 5 #作为从库时生效,从库复制中如何有慢sql也将被记录 log_slow_slave_statements = 1 #慢查询执行的秒数,必须达到此值可被记录 long_query_time = 8 #检索的行数必须达到此值才可被记为慢查询 min_examined_row_limit = 100 #mysql binlog日志文件保存的过期时间,过期后自动删除 expire_logs_days = 5建立MySQL服务
# 添加Mysql到系统服务 cd /usr/local/mysql-8.0 cp -a ./support-files/mysql.server /etc/init.d/mysql # 若mysqld,以下mysql相应的修改mysqld,如下图所示 chmod +x /etc/init.d/mysql chkconfig --add mysql # 检查服务是否生效 chkconfig --list mysql
启动Mysql服务
# 启动 service mysql start; # 查看启动状态 service mysql status;
系统默认会查找/usr/bin下的命令,如果这个命令不在这个目录下,会找不到mysql的相关命令,我们需要做的就是映射一个链接到/usr/bin目录下,相当于建立一个链接文件
首先得知道mysql命令或mysqladmin命令的完整路径,比如mysql的路径是:/usr/local/mysql-8.0/bin/mysql,我们则可以这样执行命令: # ln -s /usr/local/mysql-8.0/bin/mysql /usr/bin
修改root密码
# 进入mysql
mysql -uroot -p
输入初始密码# 如果想要所有主机都可访问,把localhost改成% alter user 'root'@'localhost' identified with mysql_native_password by '123456';
赋予权限格式:grant 权限 on 数据库对象 to 用户@IP(或者相应正则)
注:可以赋予select,delete,update,insert,index等权限精确到某一个数据库某一个表。
GRANT ALL PRIVILEGES ON *.* TO '用户名'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;
这里表示赋予该用户所有数据库所有表(*.*表示所有表),%表示所有IP地址。
# 刷新 flush privileges;
开放3306端口:
让外网能够访问mysql
a.配置防火墙: firewall-cmd --zone=public --add-port=3306/tcp --permanent(开放3306端口)
systemctl restart firewalld(重启防火墙以使配置即时生效)
查看系统所有开放的端口:firewall-cmd --zone=public --list-ports
常用的mysql操作命令:
1:新建mysql用户: 登录mysql mysql -u root -p 输入密码 CREATE USER 'test'@'localhost' IDENTIFIED WITH mysql_native_password BY 'qwe123'; 注意:此处的"localhost",是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将"localhost"改为"%",表示在任何一台电脑上都可以登录。也可以指定某台机器可以远程登录。如果需要限定IP访问,可以修改localhost-->指定IP地址。 如果还需要设置到另一个ip, 那么就需要重复上面的步骤: CREATE USER 'test'@'129.xxx.xxx.xx' IDENTIFIED WITH mysql_native_password BY 'qwe123'; 2. 为用户授权 这里直接赋所有的权限 GRANT ALL PRIVILEGES ON *.* TO 'test'@'139.xxx.xxx.xx' 如果需要指定权限,就将ALL改为SELECT DELETE UPDATE INSERT等四种权限任选即可
grant insert,select,update on test01.* to 'mayiic_dev'@'%';
flush privileges; //刷新系统权限表
3、删除指定的用户:
drop user 'test'@'106.xxx.xx.xx';
4、 查询用户和权限
use mysql;
select Host,User from user where user='root';
show grants for root;1、 显示数据库列表。 show databases; 2、 显示库中的数据表: # 指定数据库 use mysql; #显示指定库中的表 show tables; 3、 显示数据表的结构: describe 表名; 4、 建库与删库: create database 库名; drop database 库名;
MySQL8.0 忘记 root 密码下如何修改密码?1、vim /etc/my.cnf,添加 skip-grant-table(跳过权限验证)
binlog日志,即binary log,是二进制日志文件。它有两个作用,一是增量备份,即只备份新增的内容;二是用于主从复制等,即主节点维护了一个binlog日志文件,从节点从binlog中同步数据。我们可以通过binlog日志恢复数据。下面就介绍一下开启MySQL binlog日志的过程:
1、登录MySQL,查看binlog日志的状态
登录MySQL后,输入 show variables like '%log_bin%';查看到binlog日志为OFF关闭状态;
2、开启MySQL binlog日志
vi /etc/my.cnf
server_id=2 #log日志文件存放位置 log_bin = /var/bin/mysql/mysql-bin binlog_format = ROW expire_logs_days = 30
注意:每次服务器(数据库)重启,服务器会调用flush logs;,新创建一个binlog日志
cd /var/bin/mysql/mysql-bin
数据恢复语法:
恢复语法
恢复命令的语法格式:
mysqlbinlog mysql-bin.0000xx | mysql -u用户名 -p密码 数据库名
常用参数选项解释:
--start-position=780 起始pos点
--stop-position=904 结束pos点
--start-datetime="2019-3-27 12:04:08" 起始时间点
--stop-datetime="2019-3-27 12:49:46" 结束时间点
--database=my_test 指定只恢复my_test数据库(一台主机上往往有多个数据库,只限本地log日志)
!!!!Ubuntu我没用熟悉吧 牢记 在mysqlbinlog和mysq前面都要加上sudo!!!!
For example 指定pos结束点恢复(部分恢复)
恢复到780节点
sudo mysqlbinlog mysql-bin.000002 --stop-position 780 | sudo mysql -uroot -p my_test
binlog 日志文件转sql
进入mysql 的安装目录bin 目录执行----》mysql-bin.000011的文件路径
mysqlbinlog --base64-output=decode-rows -v mysql-bin.000011 -d db1 > db1.sql //将row格式的binlog日志文件base64解析后转入文件,-v代表换行展示
mysqlbinlog --start-date="2017-08-12 15:00:19" --stop-date="2017-08-12 15:30:19" mysql-bin.000011 -d db1 > db1.sql //选择时间范围导出
执行sql语句时报错:
Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nona
解决:
SELECT @@sql_mode;
查询出来的值为:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
修改mysql的配置文件:
vim /etc/my.cnf
加入上面查询出来的内容,去掉ONLY_FULL_GROUP_BY
eg:
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
然后重启mysql解决:
service mysql restart