mysql官方文档记录-持续更新

官方文档

安装

  • 我使用的是二进制的安装包,也就是mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz,下载地址是https://dev.mysql.com/downloads/mysql/

  • 安装步骤参看,我的步骤如下

shell> groupadd mysql
shell> useradd -r -g mysql -s /bin/false mysql
shell> cd /usr/share
shell> tar zxvf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
shell> cp mysql-5.7.22-linux-glibc2.12-x86_64 mysql57
shell> cd mysql57
shell> mkdir data
shell> chown mysql:mysql data
shell> chmod 750 data
shell> vi /etc/profile
#输入
export PATH=/usr/share/mysql57/bin:$PATH
#保存退出
shell> source /etc/profile
shell> mysqld --user=root --basedir=/usr/share/mysql57 --datadir=/usr/share/mysql57/data --lc_messages_dir=/usr/share/mysql57/share --lc_messages=en_US &

上面的vi是将mysqld加入到linux的$PATH里
我的mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz放在/usr/share路径下

启动数据库

参考文档

在安装的步骤里

bin/mysqld --user=root --basedir=/usr/share/mysql57 --datadir=/usr/share/mysql57/data --lc_messages_dir=/usr/share/mysql57/share --lc_messages=en_US &

就是启动了,& 表示后台运行

可以使用 mysqld --verbose --help
来查看mysqld都可以带哪些参数。

但是每次启动都要带一堆的参数未免太过麻烦,因此mysql给我们提供了一个cnf的文件可以来简化这个参数。

cnf文件

建立一个/usr/share/mysql57/my.cnf 文件内容如下

[mysqld]
socket=/usr/share/mysql57/data/mysql.sock
user=mysql
basedir=/usr/share/mysql57
datadir=/usr/share/mysql57/data
lc_messages_dir=/usr/share/mysql57/share
lc_messages=en_US
  • [mysqld]表示mysqld这个命令
  • 剩下的键值对就是启动的时候的那些参数。

有了这个文件,就可以使用
mysqld --defaults-file=/usr/share/mysql57/my.cnf &来直接启动了。

省略cnf文件

上面是通过–defaults-file指定一个cnf文件,但其实cnf文件也是可以省略的。因为mysqld启动的时候会去找几个默认的cnf文件位置,但这些文件位置在哪里呢?可以通过mysqld --verbose --help|grep cnf查找到如下

shell> mysqld --verbose --help|grep cnf

打印结果如下


/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 
                      my.cnf, $MYSQL_TCP_PORT, /etc/services, built-in default

只需要在上述的几个位置放入my.cnf,比如

mv /usr/share/mysql57/my.cnf /etc/my.cnf

然后通过mysqld &启动

关闭数据库

mysqladmin shutdown -uroot -pdevuser
-S/usr/share/mysql57/data/mysql.sock

当然 -u -p -S都可以配置到cnf文件里

[mysqladmin]
socket=/usr/share/mysql57/data/mysql.sock

连接数据库

mysql -uroot -proot

发现

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'

这里需要指定一个sock文件,由于我们的my.cnf文件里指定mysqld的socket

[mysqld]
socket=/usr/share/mysql57/data/mysql.sock

所以mysql也需要指定socket,如下

mysql -uroot -pdevuser -S/usr/share/mysql57/data/mysql.sock

但这样指定未免太麻烦,而mysql的参数其实也是可以在my.cnf里配置,如下

[mysql]
socket=/usr/share/mysql57/data/mysql.sock

这样就不用指定-S.

如何知道mysql都可以带哪些参数?同mysqld命令一样,可以通过
mysql --help 查看

通过远程连接数据库

上面的操作都是在linux本机上操作的,如果通过远程去连接,就会报以下错误

Product:  DbVisualizer Pro 9.0.2
Build:  #1912 (2012/12/18 10:21)
Java VM:  Java HotSpot(TM) 64-Bit Server VM
Java Version:  1.8.0_131
Java Vendor:  Oracle Corporation
OS Name:  Windows 10
OS Arch:  amd64
OS Version:  10.0

An error occurred while establishing the connection:

Long Message:
null, message from server: "Host '192.168.1.101' is not allowed to connect to this MySQL server"

Details:
   Type: java.sql.SQLException
   Error Code: 1130
   SQL State: HY000

解决办法

//允许用户root从任何主机连接到mysql服务器的话。 
 
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' ; 
 
FLUSH   PRIVILEGES; 
 
//允许用户root从ip为192.168.1.88的主机连接到mysql服务器
 
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.88' IDENTIFIED BY 'mypassword' ;
FLUSH   PRIVILEGES; 

以前碰到这种问题都是baidu,上面其实是从baidu上查找到的,但其实这个涉及到mysql的账号管理。

账号管理

参考文档

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

其中的mysql是系统级别用来管理账号的,
mysql将用户存在mysql.user这个表里。那如何查找用户的权限呢?

关于增删改查用户在参考文档里已经很详细了。比较需要关心的是给用户赋予权限。

赋予权限

Do not ever give anyone (except MySQL root accounts) access to the user table in the mysql system database!

mysql> CREATE USER 'test' IDENTIFIED BY 'test';
mysql> GRANT ALL PRIVILEGES ON test.* TO 'test'@'%';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON test.* TO 'test'@'%';
权限说明
SELECT查表
INSERT插表
UPDATE更新表
DELETE删除表
CREATE建表
DROP删库

更多详细的说明

查询账号权限

eg:

SHOW GRANTS FOR 'joe'@'office.example.com';

SHOW GRANTS FOR 'joe'@'home.example.com';

注意 账号必须是 user name@host name来联合制定权限,也就是说’joe’从’office.example.com’上登录和从’home.example.com’是有可能具有不一样的权限的。

日志
Log TypeInformation Written to Log
Error logProblems encountered starting, running, or stopping mysqld
General query logEstablished client connections and statements received from clients
Binary logStatements that change data (also used for replication)
Relay logData changes received from a replication master server
Slow query logQueries that took more than long_query_time seconds to execute
DDL log (metadata log)Metadata operations performed by DDL statements
配置log-error
[mysqld]
log-error=/usr/share/mysql57/logs/log_err.log
mkdir usr/share/mysql57/logs/
chown -R usr/share/mysql57/logs/
配置慢查询

show vaiables like ‘slow%’
在这里插入图片描述

set global slow_query_log=on; #开启慢查询日志
set global slow_query_log_file='d:/logs/mysql/query_slow_log.log'; #指定日志文件路径
set global long_query_time=3; # 单位是秒
set global log_queries_not_using_indexes=true;记录未使用索引的sql

事务提交到redo日志中,再从redo日志中刷新到磁盘里。

数据库恢复
mysql配置参数的设置
  • 全局参数
set global wait_timeout=3600;
set global interactive_timeout=3600;
  • 会话参数
set session wait_timeout=3600;

mysql优化

大多数的MYSQL 索引(PRIMARY KEY, UNIQUE, INDEX, and FULLTEXT)村成为B-tree.

索引的使用 =, >, >=, <, <=, or BETWEEN
注意like

下列语句是使用不到索引的

SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE other_col;

而下列语句是使用索引的

SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';

最左匹配

explain output 含义
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值