Mysql的安装、基本操作(2016.6.04第六周课程笔记)

mysql的安装、基本操作(2016.6.04第六周课程笔记)

--rhel版本自带两个数据库,分别为mysql和postgresql

# rm /var/lib/mysql/* -rf    --删除rpm版mysql数据库的数据文件
# rpm -qa |grep ^mysql        --我这里查找到已经安装了这么多mysql的软件包
mysql-devel-5.1.71-1.el6.x86_64
mysql-test-5.1.71-1.el6.x86_64
mysql-server-5.1.71-1.el6.x86_64
mysql-connector-java-5.1.17-6.el6.noarch
mysql-5.1.71-1.el6.x86_64
mysql-libs-5.1.71-1.el6.x86_64
mysql-bench-5.1.71-1.el6.x86_64
mysql-connector-odbc-5.1.5r1144-7.el6.x86_64

下面我需要重装这些软件包,在使用yum remove mysql*时删除的包包括依赖性特别的多,这样很可能会因为删除了其它服务需要使用的rpm包,而造成其它服务或系统其它的功能缺失

解决方法:
方法一:

rpm -e mysql-5.1.71-1.el6.x86_64 --nodeps
rpm -e mysql-devel-5.1.71-1.el6.x86_64 --nodeps
rpm -e mysql-server-5.1.71-1.el6.x86_64 --nodeps
rpm -e mysql-test-5.1.71-1.el6.x86_64 --nodeps
rpm -e mysql-connector-java-5.1.17-6.el6.noarch --nodeps
rpm -e mysql-libs-5.1.71-1.el6.x86_64 --nodeps
rpm -e mysql-bench-5.1.71-1.el6.x86_64 --nodeps
rpm -e mysql-connector-odbc-5.1.5r1144-7.el6.x86_64 --nodeps
再重装回来
yum install mysql* 

方法二:

rpm -qa |grep ^mysql |xargs rpm -e --nodeps
再重装回来
yum install mysql*

方法三:
直接使用yum remove mysql*  去删除包
再用下面的命令重装回来

# cat /var/log/yum.log |grep "Jun 04" |grep Erased |awk '{print $NF}' |xargs  yum install -y

--上面三个方法最好的应该是方法二,操作快速,而且不会像方法三那样去删除了其它的依赖性包(因为你删除其它的依赖性包,就算是再安装回来,那么原来的配置文件被刷新了)

=====================================================================

完全新安装mysql后,确认有mysql这个用户
# id mysql    --安装rpm版mysql后,默认就会安装这个用户,它用于默认跑mysql的daemon
uid=27(mysql) gid=27(mysql) groups=27(mysql)

linux下任何服务都需要一个用户来跑(跑守护进程)

# /etc/init.d/mysqld start

    --如果/var/lib/mysql/目录为空,那么第一次启动为初始化数据库,第二次以后就不用初始化了

# ls /var/lib/mysql/        --这里就是默认初始化之后产生的文件
ibdata1  ib_logfile0  ib_logfile1  mysql  mysql.sock  test

# mysql        --登录,默认空密码

mysql> show databases;    或者show schemas;    --查看有哪些库(默认看到三个库,类似三个目录,里面存放表)
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.00 sec)

mysql> use information_schema;     --进入一个库(类似linux cd一个目录)

mysql> select database();    --查看当前在哪个库(类似linux的pwd)
+--------------------+
| database()         |
+--------------------+
| information_schema |
+--------------------+

mysql> show tables;        --查看当前库有哪些表(类似linux的ls)

mysql> desc CHARACTER_SETS;

mysql> select * from CHARACTER_SETS;

mysql> select * from CHARACTER_SETS\G    --把;号换成\G表示当一个表的列太多时,屏幕显示不完全,可以使用\G,把它转换格式显示

mysql> select TABLE_SCHEMA,TABLE_NAME,ENGINE from tables;    --只指定查看一个表的其它几列

mysql> select user,host,password from mysql.user;    --查看mysql库的user表里的三列(mysql.user类似一个绝对路径的写法)

+------+----------------+----------+
| user | host           | password |
+------+----------------+----------+
| root | localhost      |          |
| root | li.cluster.com |          |
| root | 127.0.0.1      |          |
|      | localhost      |          |
|      | li.cluster.com |          |
+------+----------------+----------+

mysql> select user();        --查看当前的登录用户
+----------------+
| user()         |
+----------------+
| [email protected] |
+----------------+

mysql> quit            --退出mysql的命令行

# netstat -ntlup |grep :3306        --rpm版mysql默认监听3306端口
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      3720/mysqld

# ls /var/lib/mysql/    --rpm数据文件
ibdata1         --innodb引擎数据文件,information_schema一些信息在此
ib_logfile1          
ib_logfile0         --innodb相关日志组
mysql.sock        --用于本地连接;是unix沿用下来的一种连接机制。远程连接用tcp/ip,本地也可以用tcp/ip。socket连接速度相对快一点,tcp/ip相对稳定点
mysql                --对应mysql库
test            --对应test库

# rm /var/lib/mysql/mysql.sock
rm: remove socket `/var/lib/mysql/mysql.sock'? y

# mysql    --连接报错,找不到socket文件
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

[[email protected] ~]# mysql  -h 127.0.0.1    --但是通过tcp/ip连接

--解决方法,重启mysqld(不能从别人机器拷过来,因为socket与本系统相关,是拷不到其它系统上去的)

--socket和tcp/ip连接的区别:
socket是unix的一种连接机制,用于本地程序连接
tcp/ip用于远程程序连接,也可以用于本地连接(当使用IP为本地IP时)
如果是本地连接.socket效果要好,从优化角度讲,本地最好用socket

--------------------------------------------------------------

修改密码三种方法:
第一种:
[[email protected] ~]# mysqladmin -u root password "123"    --把root用户登录密码改为123
[[email protected] ~]# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[[email protected] ~]# mysql -p123    --参数与密码之间没有空格
[[email protected] ~]# mysql -p    --不想明文登录就使用这种方式
Enter password:

# mysqladmin -u root password '456' -p123    --有密码后,再使用这个命令改密码,就需要原密码

第二种:
mysql> update mysql.user set password=password("789") where user="root" and host="localhost";     --使用sql语句在数据库内部直接修改用户密码表,password()是一个密码加密函数
mysql> flush privileges;    --修改过密码后都要记得刷新权限表

第三种:
mysql> set password for 'root'@'localhost'=password('123'); --使用此操作语句也可以修改密码,修改后不需要刷新权限表

mysql> select user,host,password from mysql.user;
+------+----------------+-------------------------------------------+
| user | host           | password                                  |
+------+----------------+-------------------------------------------+
| root | localhost      | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| root | li.cluster.com |                                           |
| root | 127.0.0.1      |                                           |
|      | localhost      |                                           |
|      | li.cluster.com |                                           |
+------+----------------+-------------------------------------------+

--另外四个用户不安全,所以下面把它们都删除掉

mysql> delete from mysql.user where host="li.cluster.com" or host="127.0.0.1";
mysql> delete from mysql.user where user="";

mysql> select user,host,password from mysql.user;
+------+-----------+------------------+
| user | host      | password         |
+------+-----------+------------------+
| root | localhost | 773359240eb9a1d9 |
+------+-----------+------------------+

mysql> flush privileges;

--或者直接用这一条去删
mysql> delete from mysql.user where password="";

mysql> flush privileges;

--把test库(是个空库,用于测试用的)也删除掉
mysql> drop database test;    或者drop schema test;

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
+--------------------+

===============================================================

mysql> show variables;    --查看mysql的当前参数和对应的值
mysql> show status;    --查看mysql运行的各个状态参数

--修改参数例子
mysql> show variables like  "%connections";    --模糊查询
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| max_connections      | 151   |
| max_user_connections | 0     |

mysql> show processlist;    --查看当前有哪些连接
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host      | db   | Command | Time | State | Info             |
+----+------+-----------+------+---------+------+-------+------------------+
| 30 | root | localhost | NULL | Sleep   |   58 |       | NULL             |
| 38 | root | localhost | NULL | Query   |    0 | NULL  | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+

mysql> set global max_connections=200;    --把最大允许的链接数改为150
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like  "%connections";
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| max_connections      | 200   |     --再次查看变成200
| max_user_connections | 0     |

--但注意上面的修改重启又回变回到151

mysql的配置文件,rpm 版默认为/etc/my.cnf

[mysqld]    --用中括号括起来的叫参数组,用来针对不同的工具设定参数
datadir=/var/lib/mysql    --数据文件存放的目录
socket=/var/lib/mysql/mysql.sock    --socket文件是用于本地连接mysql数据库的接口文件,远程连接的话就要通过TCP/IP协议
user=mysql    --管理mysql的系统用户
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
max_connections=200    --加到这里,重启后,这个值就不会变回151了

[mysqld_safe]
log-error=/var/log/mysqld.log    --错误日志文件
pid-file=/var/run/mysqld/mysqld.pid    --pid文件

--注意,pid文件和socket文件是服务启动成功后才会有的

例:理解参数组

在/etc/my.cnf 后面加上一段

[client]        --针对客户端登录时的参数组
password=123        --客户端登录时直接使用123这个密码了

mysql   --再次登录就不需要密码了

--直接使用mysqld_safe来启动mysql数据库
[[email protected] ~]# /usr/bin/mysqld_safe --defaults-file=/etc/my.cnf &

停掉这个数据库可以
# /usr/bin/mysqladmin shutdown -p123

# /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql &

停也可以直接 kill -TERM `cat /var/run/mysqld/mysqld.pid`

----------------------------------------------------------------------

忘记密码如何修改
1,可以在配置文件里加上
skip-grant-tables    --注意写到[mysqld]参数组下,表示跳过授权

2,/etc/init.d/mysqld  restart

mysql    --登录就不需要密码,进去改密码,改完后,直接flush privileges就可以使用新密码来登录了

3,改完后记得去掉skip-grant-tables重新reload

4,再使用新的密码登录

-----------------------------------------------------------------------
源码版
三种版本的比较:
rpm   安装方便,功能已经定制好。对于特别大量的环境做批量安装比较方便。
二进制 安装比较方便,功能也是已经定制好,但有所选择。其实就是省去编译步骤的源码版。
源码版 安装过程比较麻烦,要求技术水平高,但能自己去定制需要的功能,生产环境下有功能需求的话尽量使用这种版本

尝试安装mysql-5.6.25的源码版

下载路径为:
http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.25.tar.gz/from/http://mysql.mirror.rafal.ca/

MySQL5.5版本之后,编译的选项同样众多,DBA可以通过# cmake . -LH
查看支持的参数,或者浏览下列页面:http://dev.mysql.com/doc/refman/5.6/en/source-
configuration-options.html,查看编译时可指定参数的详细描述。

一些常用参数如下:

* CMAKE_INSTALL_PREFIX:指定MySQL程序的安装目录,默认/usr/local/mysql
* DEFAULT_CHARSET:指定服务器默认字符集,默认latin1
* DEFAULT_COLLATION:指定服务器默认的校对规则,默认latin1_general_ci
* ENABLED_LOCAL_INFILE:指定是否允许本地执行LOAD DATA INFILE,默认OFF
* WITH_COMMENT:指定编译备注信息
* WITH_xxx_STORAGE_ENGINE:指定静态编译到mysql的存储引擎,MyISAM,MERGE,MEMBER以及CSV四种引擎默认即被编译至服务器,不需要特别指定。
* WITHOUT_xxx_STORAGE_ENGINE:指定不编译的存储引擎
* SYSCONFDIR:初始化参数文件目录
* MYSQL_DATADIR:数据文件目录
* MYSQL_TCP_PORT:服务端口号,默认3306
* MYSQL_UNIX_ADDR:socket文件路径,默认/tmp/mysql.sock

先把你的机器上已经被人安装过的源码mysql给删除掉

# rm /usr/local/mysql  -rf        --删除安装目录(大部分的安装文件,命令,配置文件都放在这)
# rm /mysqldata56/ -rf        --删除定义的数据目录(此目录是自定义的)
# rm /usr/src/mysql-* -rf    --删除以前编译过mysql的源码

软件包路径:
下载软件包:mysql-5.6.25.tar.gz

安装前准备:

# yum groupinstall "Development tools" -y
# yum groupinstall "Desktop Platform Development" -y
# yum install cmake  -y        --mysql5.5之后的版本需要使用cmake来进行编译
# yum install ncurses-devel -y

安装过程:

# tar xf mysql-5.6.25.tar.gz -C /usr/src/
# cd /usr/src/mysql-5.6.25/
# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=gbk,gb2312 -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1
# make
# make install

安装后
1,手动编写my.cnf配置文件
# mkdir /usr/local/mysql/etc
# vim /usr/local/mysql/etc/my.cnf

[mysqld]
port=3307            
datadir=/mysqldata56
pid-file=/mysqldata56/mysql56.pid
socket=/mysqldata56/mysql56.socket
log-error=/mysqldata56/mysql56-err.log
user=mysql

[client]
socket=/mysqldata56/mysql56.socket

2:创建相关目录,并修改权限

# mkdir /mysqldata56
# chown mysql.mysql  /mysqldata56  /usr/local/mysql/ -R

3:初始化数据库

# /usr/local/mysql/scripts/mysql_install_db --defaults-file=/usr/local/mysql/etc/my.cnf --user=mysql --basedir=/usr/local/mysql/

 
4:启动服务

# /usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/etc/my.cnf &

--这样启动mysql不能实现开机自动启动(解决方法:1,自己写服务脚本 2,写到/etc/rc.local里)

5:登录

# /usr/local/mysql/bin/mysql

登录命令太长:可以做软链接或别名 ,或直接把此命令拷到/bin/下换个名字(因为rpm版也有mysql命令,防止冲突)

如果服务启不来:
排错思路:先细心对比一下过程(参数是否写错),看下是否进程已经存在(已经启动了)。如果还查不出来,可以尝试查看错误日志里的报错,根据报错再来排错

===========================================================

源码版mysql自带了服务脚本,路径在/usr/src/mysql-5.6.25/support-files/mysql.server
(但是这个脚本里默认使用的配置文件是/etc/my.cnf,默认使用的datadir是/usr/local/mysql/data)
这样就很受这个脚本的限制,很多参数无法随心所欲的自定义。

要解决这个问题:
方法一:改它这个服务脚本,对应你自己定义的参数

方法二:自己简单写一个,能实现基本功能就行
扩展自己写一个支持chkconfig的服务启动脚本的基本思路:

# vim  /etc/init.d/mysql56
#!/bin/bash

# chkconfig: 2345 64 36


start() {
    /usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/etc/my.cnf &
}

stop() {
    kill -15 `cat /mysqldata56/mysql56.pid`
}


case "$1" in
    start )
        start ;;
    stop )
        stop ;;
    restart )
        stop
        start
        ;;
    * )
        echo "只支持(start|stop|restart)"
esac

# chmod 755 /etc/init.d/mysql56
# chkconfig --add mysql56
# chkconfig --list |grep mysql56
mysql56            0:off    1:off    2:on    3:on    4:on    5:on    6:off

未经允许不得转载:好玩吧 » Mysql的安装、基本操作(2016.6.04第六周课程笔记)