官方文档
安装
-
我使用的是二进制的安装包,也就是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 Type | Information Written to Log |
---|---|
Error log | Problems encountered starting, running, or stopping mysqld |
General query log | Established client connections and statements received from clients |
Binary log | Statements that change data (also used for replication) |
Relay log | Data changes received from a replication master server |
Slow query log | Queries 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 含义