MySQL数据库
MySQL配置文件
首先试图读/etc/my.cnf,如果存在,则采用/etc/my.cnf中的配置信息;若没有发现/etc/my.cnf文件,则试图查找MySQL的var安装路径/my.cnf,如果存在,则采用其配置信息;若没有发现/MySQL的var安装路径/my.cnf则试图读取(用户主目录)/my.cnf,如果读取到,则采用其配置信息。
SQL分类
DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括create、drop、alter等。
DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括insert、delete、udpate和select等。
DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括grant、revoke等。
DDL
mysql> create database test1;
mysql> show databases;
¡ information_schema:主要存储了系统中的一些数据库对象信息。比如用户表信息、列信息、权限信息、字符集信息、分区信息等。
¡ cluster:存储了系统的集群信息。
¡ mysql:存储了系统的用户权限信息。
¡ test:系统自动创建的测试数据库,任何用户都可以使用。
mysql> use test1
mysql> show tables;
mysql> drop database test1;
mysql> create table emp(ename varchar(10),hiredate date,sal decimal(10,2),deptno int(2));
mysql> drop table emp;
mysql> alter table emp modify ename varchar(20);
mysql> alter table emp add column age int(3);
mysql> alter table emp drop column age;
mysql> alter table emp change age age1 int(4) ;
mysql> alter table emp rename emp1;
DML
mysql> insert into emp (ename,hiredate,sal,deptno) values('zzx1','2000-01-01','2000',1);
mysql> update emp set sal=4000 where ename='lisa';
mysql> delete from emp where ename='dony';
mysql> select * from emp;
mysql> select * from emp where deptno=1;
DESC表示按照字段进行降序排列,
ASC则表示升序排列,如果不写此关键字默认是升序排列。
ORDER BY后面可以跟多个不同的排序字段,并且每个排序字段可以有不同的排序顺序。
mysql> select * from emp order by sal limit 1,3;
fun_name表示要做的聚合操作,也就是聚合函数,常用的有sum(求和)、count(*)(记录数)、max(最大值)、min(最小值)。
GROUP BY关键字表示要进行分类聚合的字段,比如要按照部门分类统计员工数量,部门就应该写在group by后面。
WITH ROLLUP是可选语法,表明是否对分类聚合后的结果进行再汇总。
HAVING关键字表示对分类后的结果再进行条件的过滤。
mysql> select deptno,count(1) from emp group by deptno having count(1)>1;
mysql> select ename,deptname from emp,dept where emp.deptno=dept.deptno;
mysql> select * from emp where deptno in(select deptno from dept); 子查询
mysql> select deptno from emp 记录联合
-> union all
-> select deptno from dept;
DCL
mysql> grant select,insert on sakila.* to 'z1'@'localhost' identified by '123';
mysql> revoke insert on sakila.* from 'z1'@'localhost';
MySQL常用维护管理工具
phpMyAdmin是最常用的MySQL维护工具,是一个用PHP开发的基于Web方式架构在网站主机上的MySQL管理工具
MySQLDumper使用PHP开发的MySQL数据库备份恢复程序
Navicat是一个桌面版MySQL数据库管理和开发工具。和微软SQLServer的管理器很像
MySQL GUI Tools是MySQL官方提供的图形化管理工具
MySQL官方提供的ODBC接口程序,系统安装了这个程序之后,就可以通过ODBC来访问MySQL
存储引擎
查看当前的默认存储引擎,可以使用以下命令:
mysql> show variables like 'table_type';
可以通过下面两种方法查询当前数据库支持的存储引擎,第一种方法为:
mysql> SHOW ENGINES \G
或者采用第二种方法:
mysql> SHOW VARIABLES LIKE 'have%';
MYISAM:支持表锁定,适合插入
InnoDB:支持行锁定,适合更新读取
MyISAM:MyISAM不支持事务、也不支持外键,其优势是访问的速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用基本上都可以使用这个引擎来创建表。
每个MyISAM在磁盘上存储成3个文件,其文件名都和表名相同,但扩展名分别是:
.frm(存储表定义);
.MYD(MYData,存储数据);
.MYI (MYIndex,存储索引)。
InnoDB
InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。
自动增长列,外键约束
备份与恢复
¡ 备份指定的数据库,或者此数据库中某些表。
shell> mysqldump [options] db_name [tables]
¡ 备份指定的一个或多个数据库。
shell> mysqldump [options] ---database DB1 [DB2 DB3...]
¡ 备份所有数据库。
shell> mysqldump [options] --all--database
完全恢复
mysql –uroot –p dbname < bakfile
注意,将备份恢复后数据并不完整,还需要将备份后执行的日志进行重做,语法如下:
mysqlbinlog binlog-file | mysql -u root –p***
一台服务器上运行多个MySQL
方法一:配置/etc/my.cnf
[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
[mysqld1]
datadir = /var/lib/mysql1
socket = /var/lib/mysql1/mysql.sock
pid-file = /var/lib/mysql1/mysqld.pid
user = mysql
port = 3307
server-id=100
log-bin=mysql-bin
log-error=/var/log/mysqld1.log
[mysqld2]
datadir=/var/lib/mysql2
socket=/var/lib/mysql2/mysql.sock
pid-file = /var/lib/mysql2/mysqld.pid
user = test
port = 3308
server-id=200
log-bin=mysql-bin
log-error=/var/log/mysqld2.log
skip-slave-start
初始化(要保证mysql和test是存在的系统帐户)
/usr/bin/mysql_install_db --user=mysql --datadir=/var/lib/mysql1
/usr/bin/mysql_install_db --user=test --datadir=/var/lib/mysql2
服务启动、停止、状态报告和验证
启动mysqld_multi start 或者
mysqld_multi start 1
mysqld_multi start 2
停止mysqld_multi stop 或者
mysqld_multi stop 1
mysqld_multi stop 2
状态报告
mysqld_multi report
方法二(简单):
Cp /usr/local/lamp/mysql/var /usr/local/lamp/mysql/var-new
Touch /root/mysqlerr.log
启动第二台实例
/usr/local/lamp/mysql/bin/mysqld_safe –pid-file=/usr/local/lamp/mysql/mysqld-new.pid –datadir=/usr/local/lamp/mysql/var-new –user=root –port=3307 –socket=/tmp/mysql-new.sock –log-error=/root/mysqlerr.log
切换数据库
/usr/local/mysql/bin/mysql –socket=/tmp/mysql.sock
/usr/local/mysql/bin/mysql –socket=/tmp/mysql-new.sock
数据库主从复制
MySQL支持一台主服务器同时向多台从服务器进行复制,从服务器同时也可以作为其他服务器的主服务器,实现链状的复制。
如果主服务器出现问题,可以快速切换到从服务器提供服务;
可以在从服务器上执行查询操作,降低主服务器的访问压力;
可以在从服务器上执行备份,以避免备份期间影响主服务器的服务。
注意:由于MySQL实现的是异步的复制,所以主从服务器之间存在一定的差距,在从服务器上进行的查询操作需要考虑到这些数据的差异,一般只有更新不频繁的数据或者对实时性要求不高的数据可以通过从服务器查询,实时性要求高的数据仍然需要从主数据库获得。
方法一:步骤:
建立日志文件,用于同步
cd /root
touch mysqlbin.log
启动主数据库
/usr/local/lamp/mysql/bin/mysqld_safe --user=root --server-id=1 --log-bin=/root/mysqlbin.log &
给从服务器授权
grant replication slave on *.* to 'repl'@'192.168.0.100';"
启动从服务器
/usr/local/lamp/mysql/bin/mysqld_safe --user=root --server-id=2
change master to
master_host='192.168.0.100',
master_port=3306,
master_user='repl';
start slave;
方法二:步骤:
(1)确保主从服务器上安装了相同版本的数据库。因为复制的功能在持续的改进中,所以在可能的情况下推荐安装最新的稳定版本。
(2)在主服务器上,设置一个复制使用的账户,并授予REPLICATION SLAVE权限。这里创建一个复制用户rep1,可以从IP为192.168.1.101的主机进行连接:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.101' IDENTIFIED BY '1234test';
Query OK, 0 rows affected (0.00 sec)
(3)修改主数据库服务器的配置文件my.cnf,开启BINLOG,并设置server-id的值。这两个参数的修改需要重新启动数据库服务才可以生效。
My.cnf中修改:
[mysqld]
log-bin = /home/mysql/log/mysql-bin.log server-id = 1
(4)在主服务器上,设置读锁定有效,这个操作是为了确保没有数据库操作,以便获得一个一致性的快照:
mysql> flush tables with read lock;
(5)然后得到主服务器上当前的二进制日志名和偏移量值。这个操作的目的是为了在从数据库启动以后,从这个点开始进行数据的恢复。
mysql> show master status;
(6)现在主数据库服务器已经停止了更新操作,需要生成主数据库的备份,备份的方式有很多种,可以直接在操作系统下cp全部的数据文件到从数据库服务器上,也可以通过mysqldump导出数据或者使用ibbackup工具进行数据库的备份
(7)主数据库的备份完毕后,主数据库可以恢复写操作,剩下的操作只需要在从服务器上执行
(8)将主数据库的一致性备份恢复到从数据库上。如果是使用.tar打包的文件包,只需要解开到相应的目录即可。
(9)修改从数据库的配置文件my.cnf,增加server-id参数。注意server-id的值必须是唯一的,不能和主数据库的配置相同,如果有多个从数据库服务器,每个从数据库服务器必须有自己唯一的server-id值。
my.cnf中修改:
[mysqld]
server-id = 2
(10)在从服务器上,使用--skip-slave-start选项启动从数据库,这样不会立即启动从数据库服务上的复制进程,方便我们对从数据库的服务进行进一步的配置:
[mysql@master1 mysql_home]$ ./bin/mysqld_safe --skip-slave-start &
[mysql@master1 mysql_home]$ Starting mysqld daemon with databases from /home/mysql/sysdb/data
(11)对从数据库服务器做相应设置,指定复制使用的用户,主数据库服务器的IP、端口以及开始执行复制的日志文件和位置等,具体语法如下:
mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name',
-> MASTER_USER='replication_user_name',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;
(12)在从服务器上,启动slave线程:
mysql> start slave;
(13)这时slave上执行show processlist命令将显示类似如下进程:
mysql> show processlist \G