欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

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

程序员文章站 2024-01-05 11:54:04
...
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,连接成功

AD:真正免费,域名+虚机+企业邮箱=0元