精华内容
下载资源
问答
  • MySQL数据库总结

    万次阅读 多人点赞 2019-11-25 13:26:13
    一、数据库简介 数据库(Database,DB)是按照数据结构来组织,存储和管理数据的仓库。 典型特征:数据的结构化、...主流的关系型数据库产品:Oracle(Oracle)、DB2(IBM)、SQL Server(MS)、MySQL(Oracle)。 数据表:数...


    一、数据库简介

    • 数据库(Database,DB)是按照数据结构来组织,存储和管理数据的仓库。
    • 典型特征:数据的结构化、数据间的共享、减少数据的冗余度,数据的独立性。
    • 关系型数据库:使用关系模型把数据组织到数据表(table)中。现实世界可以用数据来描述。
    • 主流的关系型数据库产品:Oracle(Oracle)、DB2(IBM)、SQL Server(MS)、MySQL(Oracle)。
    • 数据表:数据表是关系数据库的基本存储结构,二维数据表有行(Row),和列(Column)组成,也叫作记录(行)和字段(列)。

    二、MySQL数据类型(5.5版本)

    MySQL中除了字符串类型需要设置长度,其他类型都有默认长度.

    数值类型Java中MySQL中
    整型bytetinyint
    shortsmallint
    intint
    longbigint
    浮点型floatfloat
    doubledouble
    字符串类型String定长char() ;可变长varchar()
    时间日期datedate/time/datetime

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    三、Sql语句

    (1)Sql语句简介

    • SQL(Structured Query Language):结构化查询语言
    • SQL是在关系数据库上执行数据操作、检索及维护所使用的标准语言,可以用来查询数据,操纵数据,定义数据,控制数据。

    SQL可以分为:

    • 数据定义语言(DDL):Data Definition Language
    • 数据操纵语言(DML):Data Manipulation Language
    • 事务控制语言(TCL):Transaction Control Language
    • 数据查询语言(DQL):Data Query Language
    • 数据控制语言(DCL):Data Control Language

    (2)数据定义语言DDLcreate,alter,drop

    --数据定义语言DDL(create,alter,drop)
    
    -- 一、数据库相关的DDL
    
    -- 1.创建数据库
    CREATE DATABASE mybase;
    -- 2.创建数据库并指定字符集
    CREATE DATABASE mybase1 CHARACTER SET UTF8;
    -- 3.查看所有数据库
    SHOW DATABASES;
    -- 4.查看当前使用的数据库
    SELECT DATABASE();
    -- 5.修改数据库
    ALTER DATABASE mybase CHARACTER SET UTF8;
    -- 6.删除数据库
    DROP DATABASE mybase1;
    -- 切换数据库
    USE mybase;
    
    --二、表相关DDL
    
    -- 1.创建表
    create table exam(
    	id INT(11) PRIMARY KEY AUTO_INCREMENT,
    	name VARCHAR(20),
    	English INT,
    	Chinese INT,
    	Math int
    );
    -- 2.查看数据库中所有表
    show TABLES;
    -- 3.查看表结构
    desc exam;
    
    -- 4.表的删除
    drop table exam;
    
    -- 5.表的修改(基于exam表)
    
    -- 	5.1添加列
    ALTER TABLE exam ADD History INT NOT NULL;
    -- 	5.2修改列的类型、长度、约束
    ALTER TABLE exam MODIFY History DOUBLE(7,2);
    -- 	5.3修改表的列名
    ALTER TABLE exam CHANGE History Physics INT NOT NULL;
    -- 	5.4修改表名
    RENAME TABLE exam TO score;
    -- 	5.5修改表的字符集
    ALTER TABLE score CHARACTER SET GBK;
    -- 	5.6删除列
    ALTER TABLE score DROP Physics;
    -- 	5.7
    
    ALTER TABLE 
    
    -- 三、练习:创建emp表
    
    CREATE TABLE emp(
    	empno INT PRIMARY KEY AUTO_INCREMENT,
    	ename VARCHAR(20),
    	job VARCHAR(20),
    	mgr int,
    	hiredate DATE,
    	sal DOUBLE(7,2),
    	commit double(5,2),
    	deptno INT NOT NULL	-- 非空约束
    );
    

    表exam:
    在这里插入图片描述
    表emp:
    在这里插入图片描述

    (3)数据操纵语言DMLupdate,insert,delete

    -- 数据操纵语言DML(update,insert,delete)
    
    
    -- 1.插入部分列
    INSERT INTO score(id,NAME,English,Chinese,Math) VALUE(1,'Hudie',90,90,90);
    INSERT INTO score(id,NAME,English,Chinese) VALUE(NULL,'diedie',91,91);
    -- 2.插入所有列
    INSERT INTO score VALUES(3,'Shu',80,80,80);
    -- 3.修改记录
    UPDATE score set Chinese=99; --全表修改
    UPDATE score SET Math=100 WHERE id='1'; 
    -- 4.删除记录
    DELETE FROM score WHERE id='2';
    DELETE FROM score;
    
    -- delete与truncate的区别 √ 
    --TRUNCATE TABLE 删除表的记录:将整个表删除掉,重新创建一个新的表,属于DDL.
    --DELETE FROM 删除表的记录:一条一条进行删除,DELETE.
    INSERT INTO score VALUES(3,'Shu',80,80,80);
    DELETE FROM score;
    INSERT INTO score VALUES(NULL,'Libai',10,10,10); --不会清空AUTO_INCREMENT值
    TRUNCATE TABLE score;
    INSERT INTO score VALUES(NULL,'Libai',10,10,10); --清空AUTO_INCREMENT的值
    
    -- 事务管理:只能作用在DML语句上,如果在一个事务中使用delete删除所有记录,可以找回.
    -- 使用delete删除后可以用COMMIT和ROLLBACK找回数据,使用truncate后就找不回来了.
    
    -- delete、truncate、drop的区别 √
    deletetruncate、只是删除表的记录,drop会直接删除表.
    
    
    

    (4)数据控制语言DCLgrant,revoke

    -- 数据控制语言DCL(grant,revoke)
    -- 主要为用户授予和撤销权限
    
    -- 1.创建用户:CREATE USER 用户名@ip IDENTIFIED BY 密码;
    create user Fox@localhost identified by '123456';
    
    -- 2.给用户授权:grank 权限1,权限2,...,权限n ON 数据库名.* TO 用户名@IP;
    grant select,drop on mysql.* to Fox@localhost;
     
    -- 3.撤销权限:REVOKE 权限1,权限2,...,权限n ON 数据库名.* FROM 用户名@IP;
    revoke select on mysql.* from Fox@localhost;
    
    -- 4.查看用户的权限:SHOW GRANTS FOR 用户名@IPl
    show grants for Fox@localhost;
    -- 5.删除用户: DROP USER 用户名@IP;
    drop user Fox@localhost;
    -- 6.登录:mysql -u 用户名-p 密码;
    mysql -u root -p
    -- 7.退出登录: exit;
    exit;
    
    

    (5)数据查询语言DQLselect

    exam表:
    在这里插入图片描述

    -- 数据查询语言DQL(select)
    create table exam(
    	id INT(11) PRIMARY KEY AUTO_INCREMENT,
    	name VARCHAR(20),
    	English INT,
    	Chinese INT,
    	Math int
    );
    INSERT INTO exam VALUES(NULL,'小花',99,99,99);
    INSERT INTO exam VALUES(NULL,'小蓝',89,89,89);
    
    
    -- 1.全表查询: SELECT * FROM 表;
    SELECT * FROM exam;
    -- 2.查询部分字段: SELECT 字段,字段,字段... FROM 表;
    SELECT NAME,English,Math FROM exam;
    -- 3.过滤重复字段行: SELECT [DISTINCT] *|列名 FROM 表;
    SELECT DISTINCT Math FROM exam;
    SELECT DISTINCT name,Math FROM exam;
    -- 4.查询字段起别名: SELECT 字段 AS 新字段名,字段 新字段名 FROM 表;
    SELECT NAME,English AS English_score FROM exam;
    -- 5.查询指定字段
    SELECT NAME,English,Chinese FROM exam WHERE NAME='李白';
    -- 6.使用表达式+、-、*、/
    SELECT id,NAME,English-20 AS _English FROM exam;
    SELECT NAME,English+Math+Chinese FROM exam;
    -- 7.模糊查询
    SELECT * FROM exam WHERE NAME LIKE '小_';
    SELECT * FROM exam WHERE NAME LIKE '%%';
    -- 8.使用and,or
    SELECT * FROM exam WHERE English > 90 AND Chinese >90;
    SELECT * FROM exam WHERE English < 90 or Math >99;
    -- 9.使用in,not in
    SELECT * FROM exam WHERE id=2 OR id=3 OR id=4;
    SELECT * FROM exam where id IN(2,3,4);
    SELECT * FROM exam where id not IN(2,3,4);
    -- 10.使用between...and []
    SELECT * FROM exam WHERE English BETWEEN 90 AND 100;
    -- 11. is null,is not null
    INSERT INTO exam(id,NAME) VALUES(NULL,NULL);
    SELECT * FROM exam WHERE NAME IS NULL;
    SELECT * FROM exam WHERE NAME IS not NULL;
    -- 11.排序查询
    SELECT * FROM exam ORDER BY Chinese ASC;
    SELECT * FROM exam ORDER BY Chinese DESC;
    SELECT * FROM exam ORDER BY English DESC,Chinese DESC;-- 如果英语成绩相同,按照汉语成绩降序排列
    SELECT * FROM exam WHERE NAME LIKE '小%' ORDER BY English ASC;
    -- 12.聚合函数
    SELECT SUM(English+Math+Chinese) FROM exam;
    SELECT COUNT(id) FROM exam WHERE NAME IS NOT NULL;
    SELECT MAX(English) FROM exam;
    SELECT MIN(English) FROM exam;
    SELECT AVG(English) FROM exam ;
    

    (6)分组查询与分页查询group by,limit

    -- 一、分组查询
    
    CREATE TABLE emp(
    	empno INT PRIMARY KEY AUTO_INCREMENT,
    	ename VARCHAR(20),
    	job VARCHAR(20),
    	mgr int,
    	hiredate DATE,
    	sal DOUBLE(7,2),
    	commit double(5,2),
    	deptno INT NOT NULL	
    );
    
    INSERT INTO emp VALUES
    (1002,'白展堂','clerk',1001,'1983-05-09',7000.00,200.00,10),
    (1003,'李大嘴','clerk',1002,'1980-07-08',8000.00,100.00,10),
    (1004,'吕秀才','clerk',1002,'1985-11-12',4000.00,null,10),
    (1005,'郭芙蓉','clerk',1002,'1985-03-04',4000.00,null,10),
    (2001,'胡一菲','leader',null,'1994-03-04',15000.00,NULL,20),
    (2002,'陈美嘉','manger',2001,'1993-05-24',10000.00,300.00,20),
    (2003,'吕子乔','clerk',2002,'1995-05-19',7300.00,100.00,20),
    (2004,'张伟','clerk',2002,'1994-10-12',8000.00,500.00,20),
    (2005,'曾小贤','clerk',2002,'1993-05-10',9000.00,700.00,20),
    (3001,'刘梅','leader',null,'1968-08-08',13000.00,NULL,30),
    (3002,'夏冬梅','manger',3001,'1968-09-21',10000.00,600.00,30),
    (3003,'夏雪','clerk',3002,'1989-09-21',8000.00,300.00,30),
    (3004,'张一山','clerk',3002,'1991-06-16',88000.00,200.00,30);
    
    
    -- 1.查询每个部门的平均工资
    SELECT deptno,AVG(sal) FROM emp GROUP BY deptno;
    -- 2.查询每个职位的最高工资和最低工资
    SELECT job,MAX(sal),MIN(sal) FROM emp GROUP BY job;
    -- 3.查询每个部门每种职位的最高工资
    SELECT deptno,job,MAX(sal) FROM emp GROUP BY deptno,job;
    -- 4.查询每个部门的最高薪水,只有最高薪水大于15000的记录才被输出显示
    SELECT deptno,MAX(sal)AS max_sal FROM emp GROUP BY deptno HAVING max_sal>=15000;
    -- 5.查询每个部门的平均工资
    SELECT deptno,AVG(sal) FROM emp GROUP BY deptno HAVING AVG(sal)>9000;
    -- 6.Havaing子句与where子句的区别
    (1)where是用来过滤记录的,HAVING是用来过滤分组的
    (2)过滤的时机不相同,先过滤Where后过滤Having.  
    (3)WHERE是在查询表时逐行过滤以选取满足条件的记录
    (4)having是在数据查询后并且分完组后对分组进行过滤的
    (5)HAVING必须跟在group BY
    (6)查询语句执行顺序:5select 1from 2where 3group by 4having 6order by
    
    
    -- 二、分页查询
    -- 1.从第几页开始多少页(下标从0开始)
    SELECT * FROM emp LIMIT 0,3;
    -- 2.每页几条第几页==需要查看第几页-1)乘以第二个参数
    SELECT * FROM emp LIMIT 10,5;-- 每页五条第三页(3-1)*5
    SELECT * FROM emp LIMIT 2,2; --每页2条第2页(2-1)*2
    -- 3.查看工资最高的前十个职员信息
    SELECT * FROM emp ORDER BY sal DESC LIMIT 0,10;
    

    四、完整性约束(单表)

    主键约束:primary key (默认就是唯一非空的)
    外键约束:   用于在两个表之间建立关系,需要指定引用主表的哪一列。

    • 如果表A的主键是表B中的字段,则该字段称为表B的外键,表A(主表),表B(从表).
    • 外键是用来实现参照完整性的,主表更新时从表也更新,主表删除时如果从表有匹配的项,删除失败

    唯一约束:unique
    非空约束:not null

    CREATE TABLE emp(
    	empno INT PRIMARY KEY AUTO_INCREMENT,--主键约束
    	ename VARCHAR(20),
    	job VARCHAR(20),
    	mgr int,
    	hiredate DATE,
    	sal DOUBLE(7,2),
    	commit double(5,2),
    	deptno INT NOT NULL	-- 非空约束
    );
    -- √ 添加 唯一约束和非空约束
    ALTER TABLE exam MODIFY NAME VARCHAR(21) UNIQUE NOT NULL;
    
    -- 创建主表
    CREATE TABLE dept(
    	deptno INT PRIMARY KEY,
    	dname VARCHAR(20),
    	loc VARCHAR(20)
    );
    INSERT INTO dept VALUES
    (10,'餐饮部','上海'),
    (20,'销售部','浙江'),
    (30,'财务部','北京'),
    (40,'技术部','深圳');
    
    
    为从表emp加外键
    
    ALTER TABLE emp ADD FOREIGN KEY (deptno) REFERENCES dept(deptno);
    

    五、多表查询

    多张数据表或视图的查询叫做连接查询
    
    -- 1.笛卡尔积:
    SELECT * 
    FROM emp,dept;
    -- 2.等值链接(SELECT * FROM A,B WHERE A.主键=B.外键;)
    SELECT * 
    FROM emp,dept WHERE dept.deptno = emp.deptno;
    -- 3.内连接(SELECT * FROM A INNER JOIN B ON A.主键=B.外键;)
    SELECT * 
    FROM emp INNER JOIN dept ON dept.deptno = emp.deptno;
    -- 4.外连接:
    -- 	4.1左外连接:(SELECT * FROM A LEFT OUTER JOIN B ON 条件;)
    SELECT * 
    FROM emp LEFT OUTER JOIN dept ON dept.deptno=emp.deptno;
    -- 	4.2右外连接:(SELECT * FROM A right OUTER JOIN B ON 条件;)
    SELECT * 
    FROM emp RIGHT OUTER JOIN dept ON dept.deptno=emp.deptno;
    -- 5.子查询:
    -- 	5.1单行单列,工作地点在上海的员工
    SELECT * 
    FROM emp WHERE deptno=(SELECT deptno FROM dept WHERE loc ='上海');
    -- 	5.2多行单列,工作地点不在上海的员工
    SELECT * 
    FROM emp WHERE deptno in(SELECT deptno FROM dept WHERE loc <>'上海');
    -- 6.自连接
    SELECT e1.*,e2.* FROM emp e1 inner join emp e2 ON e1.mgr =e2.empno 
    WHERE e1.ename ='吕子乔'
    
    多表查询练习↓
    -- 1.查看每个员工的名字以及其所在部门的名字
    SELECT emp.ename,dept.dname,dept.loc 
    FROM emp,dept 
    WHERE emp.deptno = dept.deptno;
    -- 2.查看工作地点在北京的员工有哪些
    SELECT *
    FROM emp INNER JOIN dept ON emp.deptno = dept.deptno
    WHERE dept.loc ='北京';
    -- 3.查看每个城市员工的平均工资
    SELECT dept.loc,ifnull(avg(sal),0)
    FROM emp right join dept
    on emp.deptno =dept.deptno
    GROUP BY dept.loc;
    -- 4.查看工作地点在上海的员工有哪些
    SELECT emp.*,dept.dname,dept.loc 
    FROM emp LEFT OUTER JOIN dept ON emp.deptno=dept.deptno
    WHERE dept.loc='上海';
    -- 5.查找和曾小贤同职位的员工
    SELECT *
    FROM emp
    WHERE job=(SELECT job FROM emp WHERE ename='曾小贤');
    -- 6.查找薪水比整个机构平均水平高的员工
    SELECT * 
    FROM emp 
    WHERE sal>(SELECT AVG(sal) FROM emp);
    -- 7.查询出部门中有clerk但职位不是clerk的员工的信息
    SELECT * 
    FROM emp
    WHERE deptno IN(SELECT DISTINCT deptno FROM emp WHERE job='clerk') AND job!='clerk';
    -- 8.查看每个城市员工的平均工资'
    SELECT dept.loc,AVG(sal)
    FROM emp INNER JOIN dept ON emp.deptno=dept.deptno GROUP BY dept.loc;
    -- 9.查询出最低薪水高于部门20的最低薪水的部门信息
    SELECT deptno,MIN(sal) AS MIN_sal
    FROM emp 
    GROUP BY deptno 
    HAVING min_sal>(SELECT MIN(sal) FROM emp WHERE deptno=20);
    -- 10.列出所有员工的姓名及其直接上级的姓名
    SELECT e1.ename,e2.ename
    FROM emp e1 
    LEFT JOIN emp e2 ON e1.mgr = e2.empno;
    

    六、MySQL数据库练习题

    单表练习

    展开全文
  • 如在导入数据库时出现“Got a packet bigger than ‘max_allowed_packet’ bytes”或者“MySQL server has gone away”等错误,一般是由于当前导入的数据大于系统的限制的最大包大小。服务器的默认max_allowed_...
  • MySQL数据库参数优化

    千次阅读 2017-12-19 17:51:22
    MySQL数据库使用之前,根据实际业务情况,对一些重要的参数进行优化将有利于数据库的性能的提升及可靠性,首先查看MySQL参数配置文件可以通过mysql --help|grep my.cnf,注意这个命令输出的配置文件不只一个,如...
    在MySQL数据库使用之前,根据实际业务情况,对一些重要的参数进行优化将有利于数据库的性能的提升及可靠性,首先查看MySQL的参数配置文件可以通过mysql --help|grep my.cnf,注意这个命令输出的配置文件不只一个,如:/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf MySQL数据库启动之后会到以下路径下查找配置文件,并且以后查找到的为准,所以一定要保证my.cnf配置文件只放到一个目录下。否则可能会找出冲突,导致你配置的参数失效。
    MySQL数据库的参数分为两种:
    动态(dynamic)参数:可以在MySQL实例运行的时候修改并生效;
    静态(static)参数:在整个实例生命周期内不允许修改。
    可以使用SET命令对动态参数进行修改,语法如下:
    SET |[global | session] system_var_name=expr | [@@global. | @@session. | @@] system_var_name=expr
    命令中的global和session关键字表示这个参数的修改是基于当前会话的还是整个实例的生命周期。有些动态参数只能在会话中进行修改,如autocommit;有些参数修改后会在整个实例生命周期中生效,如:binlog_cache_size。
    如果想在数据库实例下一次启动的时候参数还是有效的,那么就必须在my.cnf配置文件中对参数进行修改。
    内存配置相关参数
    1.sort_buffer_size:排序缓冲区大小,这个参数定义了每个线程所使用的排序缓冲区的大小,当查询请求需要排序时,MySQL服务器会立即分配给链接这个参数所定义大小的缓冲区的全部内存。而不管这个排序是否需要这么大的内存,如果把这个参数设置成100M,那么10个需要排序查询的链接就会占用1G的内存,因此这个参数的配置要格外小心,不要将这个参数的值设置的过大。
    2.join_buffer_size:这个参数定义的是MySQL的每个线程所使用的连接缓冲去的大小,如果查询中关联了多张表,那么MySQL就会为每一个连接分配一个缓冲区,因此这个参数也不要设置的过大。在这里需要提醒一下,在互联网环境中,为了提升性能,尽量避免使用连表查询,尤其是大表的连表查询。
    3.read_buffer_size:这个参数是在MySQL进行全表扫描时所分配的内存的大小,这个参数的大小一定要是4K的倍数。
    4.read_rnd_buffer_size:索引缓冲区的大小,MySQL只是在需要时分配索引缓冲区,并且只会分配需要的内存的大小,不会按照参数设置的大小分配内存。
    以上四个参数都是为每个线程分配的,也就是说,如果有100个线程,那么所使用的内存就要×100,所以这些参数的配置值都不能过大,否则就可能找出内存浪费甚至溢出。
    5.innodb_buffer_pool_size:innodb存储引擎缓冲池大小,innodb缓冲池中缓存的数据页(默认16K)类型有:索引页、数据页、undo页、插入缓冲(合并多次写为一次写)、自适应哈希索引、锁信息、数据字典信息等。索引innodb存储引擎的性能严重依赖于这个参数,一般情况下,在系统允许的范围内,这个值应该设置的尽量大一些,计算公式如下:
    总内存-(每个线程所使用的内存×连接数)-系统保留内存。在MySQL的官方手册中建议将innodb_buffer_pool_size的大小设置为服务器内存的75%以上,但这要考虑实际情况,必须满足上面的公式的前提下才可以设置。
    从InnoDB1.0.x版本之后,引入了innodb_buffer_pool_instances参数,这个参数允许设置多个缓冲池实例,每个页根据哈希值平均分配到不同的缓冲池实例中。这样做的好处是减少数据库内部的资源竞争,增加数据库的并发处理能力。可以通过命令show variables like 'innodb_buffer_pool_instances'\G查看当前缓冲池实例个数。
    IO相关配置参数
    innodb是基于事务的存储引擎,每次数据修改,innodb首先要将事务预写到事务日志中,然后再写入磁盘,而不是每次提交都写入磁盘,因为磁盘IO的性能比较差。
    1.innodb_log_file_size:单个事务日志大小
    2.innodb_log_files_in_group:innodb事务日志文件的数量
    事务日志的总大小=innodb_log_files_in_group×innodb_log_file_size,事务日志是循环写入的方式,如果事务比较繁忙,建议将innodb_log_file_size的值调整大一些,减少文件交换。事务日志应能保持数据库服务器近1-2个小时内的事务状况,这样有利于数据恢复。
    3.innodb_log_buffer_size:日志缓冲区大小,一般32M就足够用了。
    4.innodb_flush_log_at_trx_commit:该参数控制innodb事务日志的刷新频次,有三个值:
    0:每秒进行一次log写入cache,并flush log到磁盘;
    1:默认值,在每次事务提交执行log写入cache,并flush log到磁盘,这种配置最安全,但是性能低;
    2:建议使用这个值,每次提交事务,执行log写入cache,每秒执行一次flush log到磁盘。
    5.innodb_flush_method:innodb刷新的方式,建议使用O_DIRECT,关闭深度缓存。
    6.innodb_file_per_table:innodb如何使用表空间,如果设置为1,那么将为每个表建立一个独立的表空间,这里强烈建议设置该参数为1。
    7.innodb_doublewrite:开启innodb二次写,为了增加数据的安全性,该参数也强烈建议设置为1。
    安全相关参数
    1.expire_logs_days:指定自动清理binlog的天数,建议设置在7天左右。
    2.max_allowed_packet:控制MySQL可以接收的数据包的大小,建议改成32M。如果使用了主从复制,那么这个参数最好保持一致。
    3.sysdate_is_now:确保sysdate()返回确定性。
    4.read_only:禁止非super权限的用户写权限,建议在主从复制环境的从数据库上开启这个配置,以保证从数据库不会被误写。
    5.skip_slave_start:禁止slave自动恢复,建议在主从复制环境的从数据库上开启这个配置,以避免从数据库重启后自动启动负责。
    其他
    1.sync_binlog:控制MySQL如何向磁盘刷新binlog,主从复制环境,建议将主数据库设置为1
    2.tmp_table_size和max_heap_table_size:控制内存临时表的大小,这两个值应该设置相同值,而且不要太大。
    3.max_connections:最大连接数,默认是100,这个值太小了,建议改成2000及以上。

    展开全文
  • MySQL数据库参数优化

    千次阅读 2021-03-08 01:31:33
    数据库属于 IO 密集型的应用程序,其...本文先从 MySQL 数据库IO相关缓存参数的角度来介绍可以通过哪些参数进行IO优化: 一、参数说明: 1、query_cache_size / query_cache_type (global): Query cache 主要.

    数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作。而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级。所以,要优化数据库,首先第一步需要优化的就是 IO,尽可能将磁盘IO转化为内存IO。本文先从 MySQL 数据库IO相关缓存参数的角度来介绍可以通过哪些参数进行IO优化:

     

    一、参数说明:

    1、query_cache_size / query_cache_type (global):

    Query cache 主要用来缓存 SQL语句执行的结果集ResultSet,所以仅仅只能针对 select 语句。当我们打开了 Query Cache 功能,MySQL在接受到一条 select 语句的请求后,MySQL 会直接根据预先设定好的HASH算法将接受到的 select 语句以字符串方式进行hash,然后到Query Cache 中直接查找是否已经缓存。如果已经在缓存中,该 select 请求就会直接将数据返回,从而省略了后面所有的步骤(如 SQL语句的解析,优化器优化以及向存储引擎请求数据等),极大的提高性能。

    但是 Query Cache 也有一个致命的缺陷,那就是当某个表的数据有任何任何变化,都会导致所有引用了该表的 select 语句在 Query Cache 中的缓存数据失效。所以,当我们的数据变化非常频繁的情况下,使用Query Cache 可能会得不偿失。

    Query Cache的使用需要多个参数配合,其中最为关键的是 query_cache_size 和 query_cache_type,前者设置用于缓存 ResultSet 的内存大小,后者设置在何场景下使用 Query Cache。

    (1)query_cache_size:用于缓存的大小:

    在以往的经验来看,如果不是用来缓存基本不变的数据的MySQL数据库,query_cache_size 一般 256MB 是一个比较合适的大小。当然,这可以通过计算Query Cache的命中率(Qcache_hits/(Qcache_hits+Qcache_inserts)*100))来进行调整。

    (2)query_cache_type:设置使用缓存的场景:

    0(OFF):全不使用query cache

    1(ON):除显式要求不使用 query cache 之外的所有的 select 都使用query cache,通过sql_no_cache 显示指定不使用缓存

    2(DEMOND):只有显示要求才使用query cache,通过 sql_cache 显示指定使用缓存

    2、innodb_buffer_pool_size(global):

    当使用InnoDB存储引擎时,innodb_buffer_pool_size 参数可能是影响我们性能的最为关键的一个参数了,它用来设置用于缓存 InnoDB 索引及数据块的内存区域大小。当我们操作一个 InnoDB 表的时候,返回的所有数据或者去数据过程中用到的任何一个索引块,都会在这个内存区域中走一遭。innodb_buffer_pool_size 设置了 InnoDB 存储引擎需求最大的一块内存区域的大小,直接关系到 InnoDB存储引擎的性能,所以如果我们有足够的内存,尽可将该参数设置到足够大,将尽可能多的 InnoDB 的索引及数据都放入到该缓存区域中,直至全部。我们可以通过 (Innodb_buffer_pool_read_requests – Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100% 计算缓存命中率,并根据命中率来调整 innodb_buffer_pool_size 参数大小进行优化。

    3、innodb_additional_mem_pool_size(global):

    innodb_additional_mem_pool_size 设置了InnoDB存储引擎用来存放数据字典信息以及一些内部数据结构的内存空间大小,所以当我们一个MySQL 中的数据库对象非常多的时候,是需要适当调整该参数的大小以确保所有数据都能存放在内存中提高访问效率的。这个参数大小是否足够还是比较容易知道的,因为当过小的时候,MySQL 会记录 Warning 信息到数据库的 error log 中,这时候你就知道该调整这个参数大小了。

    4、binlog_cache_size (global):

    Binlog Cache 用于在打开了binlog二进制日志记录功能的环境,是 MySQL 用来提高binlog的记录效率而设计的一个用于短时间内临时缓存binlog数据的内存区域。一般来说,如果我们的数据库中没有什么大事务,写入也不是特别频繁,2MB~4MB是一个合适的选择。但是如果我们的数据库大事务较多,写入量比较大,可与适当调高binlog_cache_size。同时,我们可以通过binlog_cache_use 以及 binlog_cache_disk_use来分析设置的binlog_cache_size是否足够,是否有大量的binlog_cache由于内存大小不够而使用临时文件(binlog_cache_disk_use)来缓存了

    5、innodb_log_buffer_size (global):

    这是 InnoDB 存储引擎的事务日志所使用的缓冲区。类似于 Binlog Buffer,InnoDB 在写事务日志的时候,为了提高性能,也是先将信息写入 redo log buffer 中,当满足 innodb_flush_log_trx_commit 参数所设置的相应条件(或者日志缓冲区写满)之后,才会将日志写入到磁盘文件中。可以通过 innodb_log_buffer_size 参数设置其可以使用的最大内存空间。

    innodb_flush_log_trx_commit 参数对 redo log 的写入性能有非常关键的影响。该参数可以设置为0,1,2,解释如下:

    • 0:每秒将 log buffer 中的数据将以写入到日志文件中,同时flush到磁盘。在机器crash并重启后,会丢失一秒的事务日志数据
    • 1:每次事务提交时,将 log buffer 中的数据写入日志文件,并同时flush到磁盘。在机器crash并重启后,不会丢失事务日志
    • 2:每次事务提交时,将 log buffer 中的数据写入日志文件,并每秒flush一次到磁盘。在机器crash并重启后,有可能丢失数据

    此外,MySQL文档中还提到,这几种设置中的每秒同步一次的机制,可能并不会完全确保非常准确的每秒就一定会发生同步,还取决于进程调度的问题。实际上,InnoDB 能否真正满足此参数所设置值代表的意义正常 Recovery 还是受到了不同 OS 下文件系统以及磁盘本身的限制,可能有些时候在并没有真正完成磁盘同步的情况下也会告诉 mysqld 已经完成了磁盘同步。

    6、innodb_max_dirty_pages_pct (global):

    这个参数和上面的各个参数不同,他不是用来设置用于缓存某种数据的内存大小的,而是用来控制在 InnoDB Buffer Pool 中可以不用写入数据文件中的Dirty Page 的比例(已经被修改但还没有从内存中写入到数据文件的脏数据)。这个比例值越大,从内存到磁盘的写入操作就会相对减少,所以能够一定程度下减少写入操作的磁盘IO。但是,如果这个比例值过大,当数据库 Crash 之后重启的时间可能就会很长,因为会有大量的事务数据需要从日志文件恢复出来写入数据文件中。同时,过大的比例值同时可能也会造成在达到比例设定上限后的 flush 操作“过猛”而导致性能波动很大。

    7、key_buffer_size (global):

    key_buffer_size 参数用来设置用于缓存 MyISAM 存储引擎中索引文件的内存区域大小。如果我们有足够的内存,这个缓存区域最好是能够存放下我们所有的 MyISAM 引擎表的所有索引,以尽可能提高性能。由于 MyISAM 引擎的特性限制了他仅仅只会缓存索引块到内存中,而不会缓存表数据库块。所以,我们的 SQL 一定要尽可能让过滤条件都在索引中,以便让缓存帮助我们提高查询效率。

    8、bulk_insert_buffer_size (thread):

    和key_buffer_size一样,这个参数同样也仅作用于使用 MyISAM存储引擎,用来缓存批量插入数据的时候临时缓存写入数据。当我们使用如下几种数据写入语句的时候,会使用这个内存区域来缓存批量结构的数据以帮助批量写入数据文件:

    • insert … select …
    • insert … values (…) ,(…),(…)…
    • load data infile… into… (非空表)

     

    二、取值建议:

    上面这几个参数是 MySQL 中为了减少磁盘物理IO而设计的主要参数,对 MySQL 的性能起到了至关重要的作用,下面是几个参数的建议取值:

    • query_cache_type : 如果全部使用innodb存储引擎,建议为0,如果使用MyISAM 存储引擎,建议为2,同时在SQL语句中显式控制是否是使用query cache;
    • query_cache_size: 根据 命中率(Qcache_hits/(Qcache_hits+Qcache_inserts)*100))进行调整,一般不建议太大,256MB可能已经差不多了,大型的配置型静态数据可适当调大;
    • binlog_cache_size: 一般环境2MB~4MB是一个合适的选择,事务较大且写入频繁的数据库环境可以适当调大,但不建议超过32MB;
    • key_buffer_size: 如果不使用MyISAM存储引擎,16MB足以,用来缓存一些系统表信息等。如果使用 MyISAM存储引擎,在内存允许的情况下,尽可能将所有索引放入内存,简单来说就是“越大越好”;
    • bulk_insert_buffer_size: 如果经常性的需要使用批量插入的特殊语句(上面有说明)来插入数据,可以适当调大该参数至16MB~32MB,不建议继续增大;
    • innodb_buffer_pool_size: 如果不使用InnoDB存储引擎,可以不用调整这个参数,如果需要使用,在内存允许的情况下,尽可能将所有的InnoDB数据文件存放如内存中,同样将但来说也是“越大越好”;
    • innodb_additional_mem_pool_size: 一般的数据库建议调整到8MB~16MB,如果表特别多,可以调整到32MB,可以根据error log中的信息判断是否需要增大;
    • innodb_log_buffer_size: 默认是1MB,写入频繁的系统可适当增大至4MB~8MB。当然如上面介绍所说,这个参数实际上还和另外的flush参数相关。一般来说不建议超过32MB;
    • innodb_max_dirty_pages_pct: 根据以往的经验,重启恢复的数据如果要超过1GB的话,启动速度会比较慢,几乎难以接受,所以建议不大于 1GB/innodb_buffer_pool_size(GB)*100 这个值。当然,如果你能够忍受启动时间比较长,而且希望尽量减少内存至磁盘的flush,可以将这个值调整到90,但不建议超过90。

     

    展开全文
  • 数据库mysql 主从方案

    千次阅读 2016-12-26 17:01:37
    双机热备的概念简单说一下,就是要保持两个数据库的状态自动同步。对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一致。 这样做的好处多。 1. 可以做灾备,其中一个坏了...一, MySQL 备

    双机热备的概念简单说一下,就是要保持两个数据库的状态自动同步。对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一致。 这样做的好处多。 1. 可以做灾备,其中一个坏了可以切换到另一个。 2. 可以做负载均衡,可以将请求分摊到其中任何一台上,提高网站吞吐量。  对于异地热备,尤其适合灾备。废话不多说了。我们直接进入主题。 我们会主要介绍两部分内容:

    一, MySQL 备份工作原理

    二, 备份实战

     

    我们开始。

    我使用的是mysql 5.5.34,

     

    image

     

    一, mysql 备份工作原理

    简单的说就是把 一个服务器上执行过的sql语句在别的服务器上也重复执行一遍, 这样只要两个数据库的初态是一样的,那么它们就能一直同步。

     

    当然这种复制和重复都是mysql自动实现的,我们只需要配置即可。

     

    我们进一步详细介绍原理的细节, 这有一张图:

    上图中有两个服务器, 演示了从一个主服务器(master) 把数据同步到从服务器(slave)的过程。

    这是一个主-从复制的例子。 主-主互相复制只是把上面的例子反过来再做一遍。 所以我们以这个例子介绍原理。

     

    对于一个mysql服务器, 一般有两个线程来负责复制和被复制。当开启复制之后。

     

    1. 作为主服务器Master,  会把自己的每一次改动都记录到 二进制日志 Binarylog 中。 (从服务器会负责来读取这个log, 然后在自己那里再执行一遍。)

     

    2. 作为从服务器Slave, 会用master上的账号登陆到 master上, 读取master的Binarylog,  写入到自己的中继日志 Relaylog, 然后自己的sql线程会负责读取这个中继日志,并执行一遍。  到这里主服务器上的更改就同步到从服务器上了。

     

    在mysql上可以查看当前服务器的主,从状态。 其实就是当前服务器的 Binary(作为主服务器角色)状态和位置。 以及其RelayLog(作为从服务器)的复制进度。

     

    例如我们在主服务器上查看主状态:

     

    image

    mysql> show master status\G
    *************************** 1. row ***************************
                File: mysql-bin.000014
            Position: 107
        Binlog_Do_DB: 
    Binlog_Ignore_DB: mysql,information_schema,performance_schema,amh
    1 row in set (0.00 sec)

    稍微解释一下这几行的意思:

    1. 第一行表明 当前正在记录的 binarylog文件名是: mysql-bin.000014.

    我们可以在mysql数据目录下,找到这个文件:

    image

     

    2.  第二行, 107. 表示当前的文件偏移量, 就是写入在mysql-bin.000014 文件的记录位置。

    这两点就构成了 主服务器的状态。  配置从服务器的时候,需要用到这两个值。 告诉从服务器从哪读取主服务器的数据。 (从服务器会登录之后,找到这个日志文件,并从这个偏移量之后开始复制。)

     

    3. 第三行,和第四行,表示需要记录的数据库和需要忽略的数据库。 只有需要记录的数据库,其变化才会被写入到mysql-bin.000014日志文件中。  后面会再次介绍这两个参数。

     

    我们还可以在从服务器上,查看从服务器的复制状态。

     

    image

       1:  mysql> show slave status\G
       2:  *************************** 1. row ***************************
       3:                 Slave_IO_State: Waiting for master to send event
       4:                    Master_Host: 198.**.***.***
       5:                    Master_User: r*******
       6:                    Master_Port: 3306
       7:                  Connect_Retry: 60
       8:                Master_Log_File: mysql-bin.000014
       9:            Read_Master_Log_Pos: 107
      10:                 Relay_Log_File: mysqld-relay-bin.000013
      11:                  Relay_Log_Pos: 253
      12:          Relay_Master_Log_File: mysql-bin.000014
      13:               Slave_IO_Running: Yes
      14:              Slave_SQL_Running: Yes
      15:                Replicate_Do_DB: 
      16:            Replicate_Ignore_DB: mysql,information_schema,amh,performance_schema
      17:             Replicate_Do_Table: 
      18:         Replicate_Ignore_Table: 
      19:        Replicate_Wild_Do_Table: 
      20:    Replicate_Wild_Ignore_Table: 
      21:                     Last_Errno: 0
      22:                     Last_Error: 
      23:                   Skip_Counter: 0
      24:            Exec_Master_Log_Pos: 107
      25:                Relay_Log_Space: 556
      26:                Until_Condition: None
      27:                 Until_Log_File: 
      28:                  Until_Log_Pos: 0
      29:             Master_SSL_Allowed: No

     

    我们还是来重点解释途中的红圈的部分:

    1.  Master_host 指的是 主服务器的地址。 

    2. Master_user 指的是主服务器上用来复制的用户。  从服务器会用此账号来登录主服务。进行复制。

    3. Master_log_file 就是前面提到的, 主服务器上的日志文件名.

    4. Read_Master_log_pos 就是前面提到的主服务器的日志记录位置, 从服务器根据这两个条件来选择复制的文件和位置。

    5. Slave_IO_Running:  指的就是从服务器上负责读取主服务器的线程工作状态。 从服务器用这个专门的线程链接到主服务器上,并把日志拷贝回来。

    6. Slave_SQL_Running: 指的就是专门执行sql的线程。 它负责把复制回来的Relaylog执行到自己的数据库中。 这两个参数必须都为Yes 才表明复制在正常工作。

     

    其他的参数之后再介绍。

     

     

    二, mysql 双机热备实战

    了解了上面的原理之后, 我们来实战。 这里有两个重点, 要想同步数据库状态, 需要相同的初态,然后配置同步才有意义。 当然你可以不要初态,这是你的自由。 我们这里从头开始配置一遍。

     

    image

     

    我们先以A服务器为起点,  配置它的数据库同步到B。  这就是主-从复制了。 之后再反过来做一次,就可以互相备份了。

     

    1, 第一步,

    在A上面创建专门用于备份的 用户:

     

    image

    grant replication slave on *.* to 'repl_user'@'192.***.***.***' identified by 'hj34$%&mnkb';

     

    上面把ip地址换成B机器的ip地址。 只允许B登录。安全。

    用户名为: repl_user

    密码为: hj34$********nkb

    这个等会在B上面要用。

     

    2. 开启主服务器的 binarylog。

    很多服务器是默认开启的,我们这里检查一下:

    打开 /etc/my.cnf

     

    image

     

    我来解释一下红框中的配置:

    前面三行, 你可能已经有了。

    binlog-do-db 用来表示,只把哪些数据库的改动记录到binary日志中。 可以写上关注hello数据库。 但是我把它注释掉了。 只是展示一下。 可以写多行,表示关注多个数据库。

    binlog-ignore-db 表示,需要忽略哪些数据库。我这里忽略了其他的4个数据库。

     

    后面两个用于在 双主(多主循环)互相备份。 因为每台数据库服务器都可能在同一个表中插入数据,如果表有一个自动增长的主键,那么就会在多服务器上出现主键冲突。  解决这个问题的办法就是让每个数据库的自增主键不连续。  上图说是, 我假设需要将来可能需要10台服务器做备份, 所以auto-increment-increment 设为10.   而 auto-increment-offset=1 表示这台服务器的序号。 从1开始, 不超过auto-increment-increment。

    这样做之后, 我在这台服务器上插入的第一个id就是 1, 第二行的id就是 11了, 而不是2.

    (同理,在第二台服务器上插入的第一个id就是2, 第二行就是12, 这个后面再介绍) 这样就不会出现主键冲突了。 后面我们会演示这个id的效果。

     

    3.  获取主服务器状态, 和同步初态。

    假设我现在有这些数据库在A上面。

    如果你是全新安装的, 那么不需要同步初态,直接跳过这一步,到后面直接查看主服务器状态。

    这里我们假设有一个 hello 数据库作为初态。

     

    image

     

    先锁定 hello数据库:

    FLUSH TABLES WITH READ LOCK;

     image

     

    然后导出数据:

    我这里只需要导出hello数据库, 如果你有多个数据库作为初态的话, 需要导出所有这些数据库:

     

    image

     

    然后查看A服务器的binary日志位置:

    记住这个文件名和 位置, 等会在从服务器上会用到。

     

    image

     

    主服务器已经做完了, 可以解除锁定了:

     

    image

     

     

    4.  设置从服务器 B 需要复制的数据库

    打开从服务器 B 的 /etc/my.cnf 文件:

     

    image 

     

    解释一下上面的内容。

    server-id 必须保证每个服务器不一样。 这可能和循环同步有关。 防止进入死循环。

    replicate-do-db 可以指定需要复制的数据库, 我这里注掉了。 演示一下。

    replicate-ignore-db 复制时需要排除的数据库, 我使用了,这个。 除开系统的几个数据库之外,所有的数据库都复制。

    relay_log 中继日志的名字。 前面说到了, 复制线程需要先把远程的变化拷贝到这个中继日志中, 在执行。

    log-slave-updates 意思是,中继日志执行之后,这些变化是否需要计入自己的binarylog。 当你的B服务器需要作为另外一个服务器的主服务器的时候需要打开。  就是双主互相备份,或者多主循环备份。 我们这里需要, 所以打开。

     

    保存, 重启mysql。

     

     

    5. 导入初态, 开始同步。

    把刚才从A服务器上导出的 hello.sql 导入到 B的hello数据库中, 如果B现在没有hello数据库,请先创建一个, 然后再导入:

    创建数据库:

    mysql> create database hello default charset utf8;

    把hello.sql 上传到B上, 然后导入:

    image

     

    如果你刚才导出了多个数据库, 需要把他们都一一上传导入。

     

    开启同步, 在B服务器上执行:

     CHANGE MASTER TO 
           MASTER_HOST='192.***.***.***', 
           MASTER_USER='repl_user', 
           MASTER_PASSWORD='hj3****', 
           MASTER_LOG_FILE='mysql-bin.000004', 
           MASTER_LOG_POS=7145;

    image

     

    上面几个参数我就不解释了。 前面说过了。

     

    重启mysql,  然后查看slave线程开启了没:

     

    image

     

    注意图中的红框, 两个都是Yes, 说明开启成功。

    Slave_IO_Running: Yes

    Slave_SQL_Running: Yes

    如果其中一个是No, 那就说明不成功。需要查看mysql的错误日志。 我在第一次做的时候就遇到这个问题。有时候密码填错了, 有时候防火墙的3306没有打开。ip地址不对,等等。 都会导致失败。

     

    我们看错误日志: mysql的错误日志一般在:

     

    image

    文件名应该是你的机器名, 我这里叫做host1.err 你换成你自己的。

     

    到这里主-从复制已经打开了。 我们先来实验一下。

    我们在A的数据库里面去 添加数据:

     

    image

    我在A的 hello数据库的test表中 连续插入了3条数据,  注意看他们的自增长id, 分别是1,11,21.  知道这是为什么吗。 前面已经说过了,不懂再回去看。

     

    我们去看一下B数据库有没有这三条数据:

     

    打开B的数据库:

    image

    发现已经在这了。 这里效果不直观。

     

    此时不要在B中修改数据。 我们接着配置从B到A的复制。  如果你只需要主从复制的话, 到这里就结束了。后面可以不看了。 所有A中的修改都能自动同步到B, 但是对B的修改却不能同步到A。 因为是单向的。 如果需要双向同步的话,需要再做一次从B到A的复制。

     

    基本跟上面一样:我们简单一点介绍:

     

    1. 在B中创建用户;

    image

     

    2. 打开 /etc/my.cnf , 开启B的binarylog:

    image

    注意红框中所新添加的部分。

     

    3. 我们不需要导出B的初态了,因为它刚刚才从A导过来。  直接记住它的master日志状态:

     

    image

    记住这两个数值,等会在A上面要用。

    B服务器就设置完了。

     

    4. 登录到A 服务器。 开启中继:

     

    image

    注意框中心添加的部分, 不解释了。

     

    5. 启动同步:

    image

    上面的ip地址是B的ip地址, 因为A把B当做master了。 不解释了。

     

    然后重启mysql服务。

    然后查看,slave状态是否正常:

     

    image

    图中出现了两个No。

    Slave_IO_Running: No

    Slave_SQL_Running: No

    说明slave没有成功, 即,从B到A的同步没有成功。 我们去查看mysql错误日志,前面说过位置:

     

    image

     

    找到  机器名.err 文件,打开看看:

    image

     

    看图中的error信息。  说找不到中继日志文件。

    这是因为我们在配置A的中继文件时改了中继文件名,但是mysql没有同步。解决办法很简单。

     

    image

     

    先停掉mysql服务。  找到这三个文件,把他们删掉。 一定要先停掉mysql服务。不然还是不成功。你需要重启一下机器了。 或者手动kill mysqld。

    好了, 启动mysql之后。 我们在来检查一下slave状态:

     

    image

     

    注意图中两个大大的Yes。  哈哈。

     

    Slave_IO_Running: Yes

    Slave_SQL_Running: Yes

     

    证明从B到A的复制也成功了。

     

    此时我们去B服务器中插入几条数据试试:

     

    image

    我在B中插入了两条数据。 注意看他们的id。  不解释。

     

    然后我们,登录去A中看看,A数据库变了没。

    image

    可以看到已经自动同步到A了。

     

    至此, AB双主互相热备就介绍完了。


    主从Master/Slave维护命令:

    master端:
    show master status;—查看状态:
    show processlist; –查看slave下MySQL进程信息
    reset master; #慎用,将清空日志及同步position

    slave端:

    CHANGE MASTER TO MASTER_LOG_FILE=’master.000019′;
    show slave status;
    show slave logs;
    show processlist;
    reset slave; #慎用,将清空slave配置信息、日志及同步position
    在从服务器上跳过错误事件
    mysql>stop slave;
    mysql>set global sql_slave_skip_counter = n(跳过主服务器中的接下来的 n 个事件。此命令对于由语句引起的复制终止有效。仅在从服务器线程没运行的时候有效);
    mysql>start slave;

    mysql 主服务器中同步用户 必须具有 SUPER ,RELOAD,REPLICATION SLAVE 权限

    当新加从服务器时,需要先在从库上 load data master; 保证和其他从库数据一致

    set global sql_slave_skip_counter=n # 客户端运行,用来跳过几个事件,只有当同步进程出现错误而停止的时候才可以执行。

    reset master #主机端运行,清除所有的日志,这条命令就是原来的flush master

    reset slave #从机运行,清除日志同步位置标志,并重新生成master.info

    虽然重新生成了master.info,但是并不起用,最好,将从机的mysql进程重启一下,

    load table tblname from master
    #从机运行,从主机端重读指定的表的数据,每次只能读取一个,受timeout时间限制,需要调整timeout时间。执行这个命令需要同步账号有reload和super权限。以及对相应的库有select权限。如果表比较大,要增加net_read_timeout 和 net_write_timeout的值

    load data from master #从机执行,从主机端重新读入所有的数据。执行这个命令需要同步账号有reload和super权限。以及对相应的库有select权限。如果表比较大,要增加net_read_timeout 和 net_write_timeout的值

    change master to master_def_list #在线改变一些主机设置,多个用逗号间隔,比如

    change master to

    master_host=’master2.mycompany.com’,

    master_user=’replication’,

    master_password=’bigs3cret’

    master_pos_wait() #从机运行

    show master status #主机运行,看日志导出信息

    show slave hosts #主机运行,看连入的从机的情况。

    show slave status (slave)

    show master logs (master)

    show binlog events [ in 'logname' ] [ from pos ] [ limit [offset,] rows ]

    purge [master] logs to ‘logname’ ; purge [master] logs before ‘date’

    //显示所有本机上的二进制日志
    mysql> SHOW MASTER LOGS;
    //删除所有本机上的二进制日志
    mysql> RESET MASTER;
    //删除所有创建时间在binary-log.xxx之前的二进制日志
    mysql> PURGE MASTER LOGS TO ‘binary-log.xxx’;
    //只保留最近6天的日志,之前的都删掉
    find /var/intra -type f -mtime +6 -name “*.log” -exec rm -f {} \;
    //用键盘左上角(也就是Esc下面)那个键包围起来,说明是命令。-1d是昨天,以此类推-1m是上个月等等
    day=`/bin/date -v -1d +%Y%m%d`;
    //给文件改名
    mv xxx.log xxx-${day}.log;
    //这里还要加上数据库的用户名密码,作用是更新日志(包括二进制日志和查询日志等等)
    mysqladmin flush-logs

     

    show processlist;查看进程
    kill proId;杀掉进程 

     

     

    参考:

    1. mysql-keepalived-实现双主热备读写分离

    http://gitsea.com/2013/06/16/mysql-keepalived-%E5%AE%9E%E7%8E%B0%E5%8F%8C%E4%B8%BB%E7%83%AD%E5%A4%87%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB/

     

    2. MySQL数据同步【双主热备】http://www.cnblogs.com/zhongweiv/archive/2013/02/01/mysql_replication_circular.html

     

    3. Mysql双机热备实现

    http://yunnick.iteye.com/blog/1845301

     

    4. 高性能Mysql主从架构的复制原理及配置详解http://blog.csdn.net/hguisu/article/details/7325124

     

    5.   mysql 基于 master-master 的双机热备配置

    展开全文
  • mysql数据库

    千次阅读 2021-03-27 20:38:51
    mysql数据库 1.数据库简介 1.1什么是数据库 保存和管理 的仓库就是数据库。 1.2数据库的分类 关系型数据库 如:MySQL,… 存在层级的关系 非关型数据库 如:mongoDB, … 2. MySQL数据库 2.1 什么是MySQL MySQL...
  • MySQL数据库命令

    万次阅读 多人点赞 2018-10-07 20:45:25
    1.对数据库常用命令 1.连接数据库 mysql -u用户名 -p密码 2.显示已有数据库 show databases; 3.创建数据库 create database sqlname; 4.选择数据库 use database sqlname; 5.显示数据库中的表(先选择...
  • 数据库MySql笔试题 文章目录数据库MySql笔试题一、数据库知识(通用)篇1.说说主键、外键、超键、候选键2.为什么用自增列作为主键?3.触发器的作用是什么?4.什么是存储过程?用什么来调用?5.说说存储过程的优缺点...
  • 如何修改MySQL数据库名称

    千次阅读 2020-09-26 00:51:56
    MySQL修改数据库名称比较麻烦,不支持直接修改,需要通过其它方式间接达到修改数据库名称的目的。 在 MySQL 5.1.23 之前的旧版本中,我们可以使用 RENAME DATABASE 来重命名数据库,但此后版本,因为安全考虑,删掉...
  • MySQL数据库

    千次阅读 2019-11-22 17:34:58
    PHP自身可以与大多数数据库进行连接,但MySQL数据库树开源界所公认的与PHP结合最好的数据库,它具有安全、跨平台、体积小和高效等特点,可谓PHP的“黄金搭档”。 MySQL简介 PHP在开发Web站点或一些管理系统时,需要...
  • 数据库mysql5.6到mysql5.7切换方案

    千次阅读 2018-06-26 16:15:55
    一、同一台服务器安装mysql5.7步骤 1、安装目录 : basedir=/home/mysql5.7/mysql-5.7.18 数据目录 : datadir= /home/mysql5.7/data 错误日志目录: log-error=/home/mysql5.7/logs/mysqld5.7....
  • MySQL数据库基本命令

    万次阅读 多人点赞 2021-06-22 15:46:13
    MySQL数据库基本命令一、概述数据库结构常用数据类型二、查看数据库结构查看当前服务器中的数据库查看数据库中包含的表查看表的结构(字段)三、SQL语句介绍四、创建及删除数据库和表(DDL)创建新的数据库创建新的...
  • 更改MySQL配置文件My.ini中的数据库存储主路径 打开MySQL默认的安装文件夹C:\Program Files\MySQL\MySQL Server 5.1中的my.ini文件,点击记事本顶部的“编辑”,“查找”,在查找内容中输入datadir后并点击“查找下...
  • 操作Mysql数据库

    千次阅读 2019-03-02 10:41:45
    MySQL所创建的数据库文件扩展为“.frm”,用于存储数据库中数据表的框架结构,MySQL数据库文件名与数据库中的表名相 同,每个表都对应有一个同名的frm文件,它与操作系统和存储引擎无关。 创建...
  • MySQL数据库修改时区

    千次阅读 2019-09-24 16:01:02
    mysql数据库修改时区 数据库时区配置有问题,导致项目中时间相关参数有问题,现在需要修改数据库时区 命令如下: 修改命令 set global time_zone = '+08:00'; set time_zone = '+08:00'; 查看命令 show variables ...
  • 数据库MySQL 5.6.45的安装

    千次阅读 2019-09-04 15:21:39
    本博文主要记录本人安装MySQL的过程以及安装过程中出现的问题,网上的参考博文太多太杂,还是自己记录最保险。本博文分别记录了在win7系统下,和linux系统下的安装过程。 在window7下安装mysql 5.6.45 (1)首先在...
  • 数据库MySQL

    万次阅读 2019-05-10 15:45:29
    MySQL数据库 基本命令 库级操作 创建数据库 create database 数据库名; 查看所有数据库 show databases; 删除数据库 drop database 数据库名; 查看连接数据库 select database(); 切换数据库 use 数据库名; 表级操作...
  • 修改mysql数据库的max_allowed_packet参数

    千次阅读 2009-09-29 11:11:00
    如在导入数据库时出现“Got a packet bigger than max_allowed_packet bytes”或者“MySQL server has gone away”等错误,一般是由于当前导入的数据大于系统的限制的最大包大小。服务器的默认max_allowed_packet值...
  • MYSQL添加新用户 MYSQL为用户创建数据库 MYSQL为新用户分配权限 1.新建用户 //登录MYSQL @>mysql -u root -p @>密码 //创建用户 mysql> insert into mysql.user(Host,User,Password) values(‘localhost’,'...
  • python3基础:操作mysql数据库

    万次阅读 多人点赞 2018-12-10 23:16:49
    mysql登陆 基本操作: ...端口号默认是3306,但是可以通过安装目录下的配置文件修改。 使用流程 引用API模块 获取与数据库的连接 执行sql语句与存储过程 关闭数据库连接 安装pymysql python3 与...
  • MySQL数据库入门学习

    万次阅读 2018-10-20 11:22:05
    数据库MySQL的入门学习
  • mysql数据库各项参数查询

    千次阅读 2020-02-03 11:15:45
    5.Query Cache 查询缓存用于缓存select查询结果 当下次即受到相同的查询请求时,不再执行实际查询处理而直接获取结果 适用于大量查询、很少改变表中数据 修改my.cnf 将query_cache_size设置为具体的大小,具体大小...
  • 以前一直在使用MYSQL数据库,最近由于工作原因改用Oracle数据库,版本12c。虽然改用了oracle但是原来mysql数据库中的数据还是需要继续使用,这就需要把mysql中的数据导入到oracle中。 1.Oracle连接MYSQL数据库 1&...
  • SpringBoot中修改MySQL数据库建表方言

    千次阅读 2018-04-25 16:06:01
    SpringBoot集成Hibernate后处理MySQL数据库时创建表的时候会出现乱码,是因为在创建表的时候使用默认的建表语言,需要修改建表语言 一、实现 修改配置数据 # jpa配置参数 # 数据库 spring.jpa.database=...
  • mysql更改数据库密码

    万次阅读 2018-12-14 11:51:42
    使用alter user 'root'@'localhost' identified by 'pass_...根据官方文档,有以下两种方式修改密码(官方文档参见https://dev.mysql.com/doc/refman/8.0/en/resetting-permissions.html) 方案一:执行初始化文...
  • MySQL数据库学习

    万次阅读 多人点赞 2018-08-13 20:41:03
    虽然笔者从事的是Android客户端的开发,平时和数据库打的交道并不多,但是我们对于数据库这一块的学习还是很重要的,今天笔者想总结下MySQL关系型数据库的一些常用知识点 数据库概述 一、常见的概念 数据库...
  • 文章目录一、 InnoDB存储引擎的表空间二、 ... mysql> show variables like 'InnoDB_data%'; 表空间有四个文件组成:ibdata1、ibdata2、ibdata3、ibdata4,每个文件的大小为10M,当每个文件都满了的时候,ibda...
  • 更改MySQL配置文件My.ini中的数据库存储主路径 打开MySQL默认的安装文件夹C:\Program Files\MySQL\MySQL Server 5.1中的my.ini文件,点击记事本顶部的“编辑”,“查找”,在查找内容中输入datadir后并点击“查找下...
  • 命令行方式操作MySQL数据库

    千次阅读 2020-07-12 15:10:59
    命令行方式操作MySQL数据库命令行方式操作MySQL数据库数据库操作1.创建数据库2.查看数据库列表3.修改数据库4.选择数据库5.删除数据库 命令行方式操作MySQL数据库 MySQL数据库类型 数据库的类型可以分成两类: 系统...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 342,726
精华内容 137,090
关键字:

修改参数名数据库mysql

mysql 订阅