mysql数据库性能的检查和调优方法

zhang 发表于 mysql 分类,标签: ,
0

我一直是使用mysql这个数据库软件,它工作比较稳定,效率也很高。在遇到严重性能问题时,一般都有这么几种可能:

1、索引没有建好;

2、 sql写法过于复杂;

3、配置错误;

4、机器实在负荷不了;

1、索引没有建好

如果看到mysql消耗的 cpu很大,可以用mysql的client工具来检查。

在linux下执行

/usr/local/mysql/bin/mysql -hlocalhost -uroot -p

输入密码,如果没有密码,则不用-p参数就可以进到客户端界面中。

看看当前的运行情况

show full processlist

可以多运行几次

这个命令可以看到当前正在执行的sql语句,它会告知执行的sql、数据库名、执行的状态、来自的客户端ip、所使用的帐号、运行时间等信息

在我的cache后端,这里面大部分时间是看不到显示任何sql语句的,我认为这样才算比较正常。如果看到有很多sql语句,那么这台mysql就一定会有性能问题

如果出现了性能问题,则可以进行分析:

1、是不是有sql语句卡住了?

这是出现比较多的情况,如果数据库是采用 myisam,那么有可能有一个写入的线程会把数据表给锁定了,如果这条语句不结束,则其它语句也无法运行。

查看processlist 里的time这一项,看看有没有执行时间很长的语句,要留意这些语句。

阅读全文 »

解析mysql 数据库的主从同步原理

zhang 发表于 mysql 分类,标签: ,
0

mysql 数据库的主从同步主要依赖Replication 线程 .   

Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql instance(我们称之 Slave)。在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在 Master 端。 

 要实现 MySQL 的 Replication ,首先必须打开 Master 端的Binary Log(mysql-bin.xxxxxx)功能,否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全 顺序的执行日志中所记录的各种操作。打开 MySQL 的 Binary Log 可以通过在启动 MySQL Server 的过程中使用 “—log-bin” 参数选项,或者在 my.cnf 配置文件中的 mysqld 参数组([mysqld]标识后的参数部分)增加 “log-bin” 参数项。  

MySQL 复制的基本过程如下:  

—————————————————————————————
1. Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;  

2. Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO 线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO 线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master 端的 Binary Log 文件的名称以及在 Binary Log 中的位置;   

3. Slave 的 IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master- info文件中,以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”    

4. Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成为在 Master 端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。这样,实际上就是在 Master 端和 Slave 端执行了同样的 Query,所以两端的数据是完全一样的。  
阅读全文 »

mysql数据库中忘记root或其他的账号时的解决办法

admin 发表于 mysql 分类,标签: , ,
1

有时时间一长或其它原因,不清楚mysql数据库中的root 账号,这时可以通过下面的方法找回root或其他账号的密码。

在windows系统下:

(1)打开cmd命令行窗口,使用”net stop mysql“命令停止mysql服务。在”net stop mysql”中”mysql”表示数据库的服务名称.

如:D:\PHP\mysql\MySQL Server 5.0\bin>net stop mysql
MySQL 服务正在停止…
MySQL 服务已成功停止。

(2)然后在cmd命令行到mysql的安装路径,找到 mysqld-nt.exe.

如mysql安装在d盘下,使用运行—>输入 “cmd”—>输入“d”切换到D盘—->然后再“cd mysql”切换到mysql目录下—->cd bin(切换到mysql下的bin目录)—-》mysqld-nt.exe就在这个bin目录下。

在这个bin目录下执行下面命令:mysqld-nt –skip-grant-tables

点击回车键后,则当前窗口将会停止,不用关闭这个窗口。

(3)打开我的电脑中的mysql的安装目录,同样在其bin目录下,找到mysql.exe文件,双击这个文件。会直接打开mysql的数据库的命令行。在这个命令行,可以直接操作数据库中信息,如

show databases—->查看数据库中的有多少个数据库等等。

再运行mysql>use mysql
>update user set password=password(“new_password”) where user=”root”;
>flush privileges;
>exit

用Ctrl+Alt+Del,找到mysqld-nt的进程杀掉它。然后再重新启动mysql服务,就可以用新密码登录了 .

注意:要是不重新启动mysql服务的话,这个更改相当于是无效的。

在linux系统下:

如果 MySQL 正在运行,首先杀之: killall -TERM mysqld。
启动 MySQL :bin/safe_mysqld –skip-grant-tables &
就可以不需要密码就进入 MySQL 了。
然后就是
>use mysql
>update user set password=password(“new_pass”) where user=”root”;
>flush privileges;
重新杀 MySQL ,用正常方法启动 MySQL 。