Mysql管理中一些常用的命令和技巧

jerry mysql 2015年11月18日 收藏
Mysql管理中一些常用的命令和技巧
1 参数设置方法:
1) 如果对服务器参数不熟悉,建议从$MYSQL_HOME/support-files下面按照需要cp合适的配置文件为数据库配置文件,例如:
cp my-large.cnf  /etc/my.cnf
2) session级修改(只对本session有效):
set para_name=value;
3) 全局级修改(对所有新的连接都有效,但是数据库重启后失效)
set global  para_name=value;
4) 永久修改
将参数在my.cnf中增加或者修改

2 mysql.sock丢失后怎么连接数据库?
请注意,如果你指定localhost作为一个主机名,mysqladmin默认使用Unix套接字文件连接,而不是TCP/IP。从 MySQL 4.1开始,通过--protocol= TCP | SOCKET | PIPE | MEMORY}选项,你可以显示地指定连接协议 ,举例如下:
socket连接:
[zzx@zzx mysql]$ mysql -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/home/zzx/mysql/mysql.sock' (2)
tcp连接:
[zzx@zzx mysql]$ mysql --protocol=TCP -uroot -p -P3307 -hlocalhost
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 73 to server version: 5.0.15-standard
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>

3 同一台机器运行多个mysql:
最简单的方法,将每个mysql安装在不同的用户下面,例如mysql1和mysql2,每个用户下面,分别执行如下操作:
export MYSQL_HOME=/home/mysql1/mysql
shell> groupadd mysql
shell> useradd -g mysql mysql1
shell> cd /home/mysql1
shell>tar -xzvf  /home/mysql1/mysql-VERSION-OS.tar.gz
shell> ln -s mysql-VERSION-OS.tar.gz mysql
shell> cd mysql
cp support-files/my-large.cnf(根据实际情况选择)  ./my.cnf
vi my.cnf ,主要修改[client]和[mysqld]下面的port和socket,并指定字符集,例如:
[client]
port            = 3307
socket          = /home/mysql1/mysql/data/mysql.sock
# The MySQL server
[mysqld]
default-character-set = utf8
port            = 3307
socket          = /home/mysql1/mysql/data/mysql.sock
。。。。。。
shell> scripts/mysql_install_db --user=mysql1
shell> chown -R root:mysql  .
shell> chown -R mysql1:mysql data
shell> bin/mysqld_safe --user=mysql &
mysql2用户执行的和mysql1类似,不同的是指定不同的MYSQL_HOME,不同的port、socket即可

4 查看用户权限:
怎么样查看用户权限,最简单的方法,通过如下语句:
mysql> show grants for 'test1'@'localhost';
如果要通过权限表来查看,比较复杂:
在5.0以下,按照以下顺序来查看:
user->db->tables_priv->columns_priv,权限范围依次递减。和参数的设置不同,权限设置的原则是:
全局权限覆盖局部权限
首先,从user表中查看user和host对应的那些权限值,比如:
select_priv="Y"
说明此用户组具有对所有数据库的所有表的select权限,此时,再单独对某个数据库设置select权限已经没有意义
如果user表中的select_priv="N",则接着查看db表中对应用户组的权限,如果存在一条记录如下:
 Host      | Db     | User      | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Create_tmp_table_priv | Lock_tables_priv |
+-----------+--------+-----------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-----------------------+------------------+
| localhost | test2  | test1     | Y           | Y           | Y           | Y           | Y           | Y         | N          | Y               | Y          | Y          | Y                     | Y                |
则表示test1@localhost用户组对test2数据库中的所有表具有所有权限(除了grant),此时单独对此数据库内的表进行权限设置已经没有意义;如果没有此记录或者对应权限不是“N”,则接着查询tables_priv表,此表中的记录决定了对数据库中实际表的权限;如果tables_priv内记录的权限都是Y,则对表内的任何列单独设置权限已经没有意义,如果tables_priv没有对应表的记录或者对应权限不是“N”,则接着查询columnss_priv表的记录。
一步一般类推,最后得出某个用户组的权限。
在mysql 5.0以后,多了一个数据字典库information_schema,通过这个库里面的USER_PRIVILEGES、SCHEMA_PRIVILEGES、TABLE_PRIVILEGES、COLUMN_PRIVILEGES表可以得到同样的结论。

5 修改用户密码:
方法1:
可以用mysqladmin命令在命令行指定密码:
shell> mysqladmin -u user_name -h host_name password "newpwd"
方法2:
为账户赋予密码的另一种方法是执行SET PASSWORD语句:
mysql> SET PASSWORD FOR 'jeffrey'@'%' = PASSWORD('biscuit');
如果是更改自己的密码,可以省略for语句:
mysql> SET PASSWORD = PASSWORD('biscuit');
方法3:
你还可以在全局级别使用GRANT USAGE语句(在*.*)来指定某个账户的密码而不影响账户当前的权限:
mysql> GRANT USAGE ON *.* TO 'jeffrey'@'%' IDENTIFIED BY 'biscuit';
方法4:
直接更改数据库的user表:
shell> mysql -u root mysql
mysql> INSERT INTO user (Host,User,Password)
  -> VALUES('%','jeffrey',PASSWORD('biscuit'));
mysql> FLUSH PRIVILEGES;
shell> mysql -u root mysql
mysql> UPDATE user SET Password = PASSWORD('bagel')
  -> WHERE Host = '%' AND User = 'francis';
mysql> FLUSH PRIVILEGES;
注意:更改密码时候一定要使用password函数(mysqladmin和grant两种方式不用写,会自动加上)

6 怎样灵活的指定连接的主机:
在user表Host值的指定方法:
l Host值可以是主机名或IP号,或'localhost'指出本地主机。 
l 你可以在Host列值使用通配符字符“%”和“_”。 
Host值'%'匹配任何主机名,空Host值等价于'%'。它们的含义与LIKE操作符的模式匹配操作相同。例如,'%'的Host值与所有主机名匹配,而'%.mysql.com'匹配mysql.com域的所有主机。

7 到底匹配哪个符合条件的用户:
例如以下两个用户:
'thomas.loc.gov'  'fred'  fred, 从thomas.loc.gov 连接
'%'       'fred'  fred, 从任何主机连接
 当从主机thomas.loc.gov进行连接的时候,上面两个用户显然都满足条件,该选择哪个呢?
如果有多个匹配,服务器必须选择使用哪个条目。按照下述方法解决问题:
服务器在启动时读入user表后进行排序。
然后当用户试图连接时,以排序的顺序浏览条目
服务器使用与客户端和用户名匹配的第一行。
当服务器读取表时,它首先以最具体的Host值排序。主机名和IP号是最具体的。'%'意味着“任何主机”并且是最不特定的。有相同Host值的条目首先以最具体的User值排序(空User值意味着“任何用户”并且是最不特定的)。例如下例是排序前和排序后的结果:
 +-----------+----------+-
| Host      | User     | …
+-----------+----------+-
| %         | root    | …
| %         | jeffrey  | …
| localhost     | root    | …
| localhost    |        | …
+-----------+----------+-
排序前
+-----------+----------+-
| Host      | User     | …
+-----------+----------+-
| localhost | root     | … ...
| localhost |         | … ...
| %      | jeffrey      | … ...
| %      | root     | … ...
+-----------+----------+-
排序后
·记住:明确指定用户名的用户不一定是被匹配的用户

8 不进入mysql,怎样运行sql语句?
使用--execute(-e)选项:
mysql -u root -p -e "SELECT User, Host FROM User" mysql
可以按这种方式传递多个SQL语句,用分号隔开:
shell> mysql -u root -p -e "SELECT Name FROM Country WHERE Name LIKE 'AU%';SELECT COUNT(*) FROM City" world
Enter password: ******
+-----------+
| Name      |
+-----------+
| Australia |
| Austria   |
+-----------+
+----------+
| COUNT(*) |
+----------+
|     4079 |
+----------+
请注意长形式(--execute)后面必须紧跟一个等号(=)。

9 客户端怎么访问内网数据库?
oracle的客户端可以通过cman来访问内网中的oralce数据库,mysql能实现类似功能吗?可以,假设服务器如下:
中转服务器ip:202.108.15.160(192.168.161.38)
内网服务器ip:192.168.161.39,在端口3306上起着mysql服务
客户端:windows,secureCRT
l 在中转服务器上增加ssh turnal,具体操作如下:
1. 点击session的属性
2. 点击connection->port_forwarding
3. 点击add按钮:name中随便起个名字;local下的ip写上127.0.0.1,port随便起一个未使用的port,例如9999;remote下面的的hostname写上192.168.161.39,端口写上3306;点击ok设置成功
l 在192.168.161.39的mysql内增加一个用户test,host设置为192.168.161.38
l grant select on dbname.* to test@192.168.161.38 identified by '123';
客户端执行mysql -h127.0.0.1 -P3306 -utest -p123,连接成功