Mysql管理中一些常用的命令和技巧1 参数设置方法:<br>
1) 如果对服务器参数不熟悉,建议从$MYSQL_HOME/support-files下面按照需要cp合适的配置文件为数据库配置文件,例如:<br>
cp my-large.cnf /etc/my.cnf<br>
2) session级修改(只对本session有效):<br>
set para_name=value;<br>
3) 全局级修改(对所有新的连接都有效,但是数据库重启后失效)<br>
set global para_name=value;<br>
4) 永久修改<br>
将参数在my.cnf中增加或者修改<br>
<br>
2 mysql.sock丢失后怎么连接数据库?<br>
请注意,如果你指定localhost作为一个主机名,mysqladmin默认使用Unix套接字文件连接,而不是TCP/IP。从 MySQL 4.1开始,通过--protocol= TCP | SOCKET | PIPE | MEMORY}选项,你可以显示地指定连接协议 ,举例如下:<br>
socket连接:<br>
[zzx@zzx mysql]$ mysql -uroot<br>
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/home/zzx/mysql/mysql.sock' (2)<br>
tcp连接:<br>
[zzx@zzx mysql]$ mysql --protocol=TCP -uroot -p -P3307 -hlocalhost<br>
Enter password: <br>
Welcome to the MySQL monitor. Commands end with ; or \g.<br>
Your MySQL connection id is 73 to server version: 5.0.15-standard<br>
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.<br>
mysql><br>
<br>
3 同一台机器运行多个mysql:<br>
最简单的方法,将每个mysql安装在不同的用户下面,例如mysql1和mysql2,每个用户下面,分别执行如下操作:<br>
export MYSQL_HOME=/home/mysql1/mysql<br>
shell> groupadd mysql<br>
shell> useradd -g mysql mysql1<br>
shell> cd /home/mysql1<br>
shell>tar -xzvf /home/mysql1/mysql-VERSION-OS.tar.gz<br>
shell> ln -s mysql-VERSION-OS.tar.gz mysql<br>
shell> cd mysql<br>
cp support-files/my-large.cnf(根据实际情况选择) ./my.cnf<br>
vi my.cnf ,主要修改[client]和[mysqld]下面的port和socket,并指定字符集,例如:<br>
[client]<br>
port = 3307<br>
socket = /home/mysql1/mysql/data/mysql.sock<br>
# The MySQL server<br>
[mysqld]<br>
default-character-set = utf8<br>
port = 3307<br>
socket = /home/mysql1/mysql/data/mysql.sock<br>
。。。。。。<br>
shell> scripts/mysql_install_db --user=mysql1<br>
shell> chown -R root:mysql .<br>
shell> chown -R mysql1:mysql data<br>
shell> bin/mysqld_safe --user=mysql &<br>
mysql2用户执行的和mysql1类似,不同的是指定不同的MYSQL_HOME,不同的port、socket即可<br>
<br>
4 查看用户权限:<br>
怎么样查看用户权限,最简单的方法,通过如下语句:<br>
mysql> show grants for 'test1'@'localhost';<br>
如果要通过权限表来查看,比较复杂:<br>
在5.0以下,按照以下顺序来查看:<br>
user->db->tables_priv->columns_priv,权限范围依次递减。和参数的设置不同,权限设置的原则是:<br>
全局权限覆盖局部权限<br>
首先,从user表中查看user和host对应的那些权限值,比如:<br>
select_priv="Y"<br>
说明此用户组具有对所有数据库的所有表的select权限,此时,再单独对某个数据库设置select权限已经没有意义<br>
如果user表中的select_priv="N",则接着查看db表中对应用户组的权限,如果存在一条记录如下:<br>
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 |<br>
+-----------+--------+-----------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-----------------------+------------------+<br>
| localhost | test2 | test1 | Y | Y | Y | Y | Y | Y | N | Y | Y | Y | Y | Y |<br>
则表示test1@localhost用户组对test2数据库中的所有表具有所有权限(除了grant),此时单独对此数据库内的表进行权限设置已经没有意义;如果没有此记录或者对应权限不是“N”,则接着查询tables_priv表,此表中的记录决定了对数据库中实际表的权限;如果tables_priv内记录的权限都是Y,则对表内的任何列单独设置权限已经没有意义,如果tables_priv没有对应表的记录或者对应权限不是“N”,则接着查询columnss_priv表的记录。<br>
一步一般类推,最后得出某个用户组的权限。<br>
在mysql 5.0以后,多了一个数据字典库information_schema,通过这个库里面的USER_PRIVILEGES、SCHEMA_PRIVILEGES、TABLE_PRIVILEGES、COLUMN_PRIVILEGES表可以得到同样的结论。<br>
<br>
5 修改用户密码:<br>
方法1:<br>
可以用mysqladmin命令在命令行指定密码:<br>
shell> mysqladmin -u user_name -h host_name password "newpwd"<br>
方法2:<br>
为账户赋予密码的另一种方法是执行SET PASSWORD语句:<br>
mysql> SET PASSWORD FOR 'jeffrey'@'%' = PASSWORD('biscuit');<br>
如果是更改自己的密码,可以省略for语句:<br>
mysql> SET PASSWORD = PASSWORD('biscuit');<br>
方法3:<br>
你还可以在全局级别使用GRANT USAGE语句(在*.*)来指定某个账户的密码而不影响账户当前的权限:<br>
mysql> GRANT USAGE ON *.* TO 'jeffrey'@'%' IDENTIFIED BY 'biscuit';<br>
方法4:<br>
直接更改数据库的user表:<br>
shell> mysql -u root mysql<br>
mysql> INSERT INTO user (Host,User,Password)<br>
-> VALUES('%','jeffrey',PASSWORD('biscuit'));<br>
mysql> FLUSH PRIVILEGES;<br>
shell> mysql -u root mysql<br>
mysql> UPDATE user SET Password = PASSWORD('bagel')<br>
-> WHERE Host = '%' AND User = 'francis';<br>
mysql> FLUSH PRIVILEGES;<br>
注意:更改密码时候一定要使用password函数(mysqladmin和grant两种方式不用写,会自动加上)<br>
<br>
6 怎样灵活的指定连接的主机:<br>
在user表Host值的指定方法:<br>
l Host值可以是主机名或IP号,或'localhost'指出本地主机。 <br>
l 你可以在Host列值使用通配符字符“%”和“_”。 <br>
Host值'%'匹配任何主机名,空Host值等价于'%'。它们的含义与LIKE操作符的模式匹配操作相同。例如,'%'的Host值与所有主机名匹配,而'%.mysql.com'匹配mysql.com域的所有主机。<br>
<br>
7 到底匹配哪个符合条件的用户:<br>
例如以下两个用户:<br>
'thomas.loc.gov' 'fred' fred, 从thomas.loc.gov 连接<br>
'%' 'fred' fred, 从任何主机连接<br>
当从主机thomas.loc.gov进行连接的时候,上面两个用户显然都满足条件,该选择哪个呢?<br>
如果有多个匹配,服务器必须选择使用哪个条目。按照下述方法解决问题:<br>
服务器在启动时读入user表后进行排序。<br>
然后当用户试图连接时,以排序的顺序浏览条目<br>
服务器使用与客户端和用户名匹配的第一行。<br>
当服务器读取表时,它首先以最具体的Host值排序。主机名和IP号是最具体的。'%'意味着“任何主机”并且是最不特定的。有相同Host值的条目首先以最具体的User值排序(空User值意味着“任何用户”并且是最不特定的)。例如下例是排序前和排序后的结果:<br>
+-----------+----------+-<br>
| Host | User | …<br>
+-----------+----------+-<br>
| % | root | …<br>
| % | jeffrey | …<br>
| localhost | root | …<br>
| localhost | | …<br>
+-----------+----------+-<br>
排序前<br>
+-----------+----------+-<br>
| Host | User | …<br>
+-----------+----------+-<br>
| localhost | root | … ...<br>
| localhost | | … ...<br>
| % | jeffrey | … ...<br>
| % | root | … ...<br>
+-----------+----------+-<br>
排序后<br>
·记住:明确指定用户名的用户不一定是被匹配的用户<br>
<br>
8 不进入mysql,怎样运行sql语句?<br>
使用--execute(-e)选项:<br>
mysql -u root -p -e "SELECT User, Host FROM User" mysql<br>
可以按这种方式传递多个SQL语句,用分号隔开:<br>
shell> mysql -u root -p -e "SELECT Name FROM Country WHERE Name LIKE 'AU%';SELECT COUNT(*) FROM City" world<br>
Enter password: ******<br>
+-----------+<br>
| Name |<br>
+-----------+<br>
| Australia |<br>
| Austria |<br>
+-----------+<br>
+----------+<br>
| COUNT(*) |<br>
+----------+<br>
| 4079 |<br>
+----------+<br>
请注意长形式(--execute)后面必须紧跟一个等号(=)。<br>
<br>
9 客户端怎么访问内网数据库?<br>
oracle的客户端可以通过cman来访问内网中的oralce数据库,mysql能实现类似功能吗?可以,假设服务器如下:<br>
中转服务器ip:202.108.15.160(192.168.161.38)<br>
内网服务器ip:192.168.161.39,在端口3306上起着mysql服务<br>
客户端:windows,secureCRT<br>
l 在中转服务器上增加ssh turnal,具体操作如下:<br>
1. 点击session的属性<br>
2. 点击connection->port_forwarding<br>
3. 点击add按钮:name中随便起个名字;local下的ip写上127.0.0.1,port随便起一个未使用的port,例如9999;remote下面的的hostname写上192.168.161.39,端口写上3306;点击ok设置成功<br>
l 在192.168.161.39的mysql内增加一个用户test,host设置为192.168.161.38<br>
l grant select on dbname.* to test@192.168.161.38 identified by '123';<br>
客户端执行mysql -h127.0.0.1 -P3306 -utest -p123,连接成功
AD:真正免费,域名+虚机+企业邮箱=0元