查看: 1582|回复: 0

[Mysql数据库] mysql安装配置、主从复制配置详解

发表于 2018-1-9 08:00:00
作者:NiceCui
  • 本文谢绝转载,如需转载需征得作者本人同意,谢谢。
  • 本文链接:http://www.cnblogs.com/NiceCui/p/8213723.html
  • 邮箱:moyi@moyibolg.com
  • 日期:2017-12-20

mysql安装、配置 1. yum 下载mysql

仅限 centos7以下 版本

  1. #yum install mysql
  2. #yum install mysql-server
  3. #yum install mysql-devel
复制代码

启动服务

  1. [root@localhost hadoop]# service mysqld restart
复制代码

centos 7 mysql-server失败

  1. [root@yl-web yl]# yum install mysql-server
  2. Loaded plugins: fastestmirror
  3. Loading mirror speeds from cached hostfile
  4. * base: mirrors.sina.cn
  5. * extras: mirrors.sina.cn
  6. * updates: mirrors.sina.cn
  7. No package mysql-server available.
  8. Error: Nothing to do
复制代码

查资料发现是CentOS 7 版本将mysql数据库软件从默认的程序列表中移除,用mariadb代替了。

MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

解决:安装mariadb

  1. [root@yl-web yl]# yum install mariadb-server mariadb
  2. mariadb数据库的相关命令是:
  3. systemctl start mariadb #启动MariaDB
  4. systemctl stop mariadb #停止MariaDB
  5. systemctl restart mariadb #重启MariaDB
  6. systemctl enable mariadb #设置开机启动
  7. 所以先启动数据库
  8. [root@yl-web yl]# systemctl start mariadb
复制代码

连接mysql

  1. [root@localhost hadoop]# mysql -u root -p
  2. Enter password:
  3. Welcome to the MySQL monitor. Commands end with ; or \g.
  4. Your MySQL connection id is 2
  5. Server version: 5.1.73 Source distribution
  6. Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.
  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  11. mysql>
复制代码
2. 配置mysql

设置密码

  1. mysql> set password for 'root'@'localhost' =password('password');
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql>
  4. //不需要重启数据库即可生效。
复制代码

设置编码

  1. mysql配置文件为/etc/my.cnf
  2. 最后加上编码配置
  3. [mysql]
  4. default-character-set =utf8
  5. //这里的字符编码必须和/usr/share/mysql/charsets/Index.xml中一致。
复制代码

远程连接设置

  1. 把在所有数据库的所有表的所有权限赋值给位于所有IP地址的root用户。
  2. mysql> grant all privileges on *.* to root@'%'identified by 'password';
  3. 如果是新用户而不是root,则要先新建用户
  4. mysql>create user 'username'@'%' identified by 'password';
  5. 此时就可以进行远程连接了。
复制代码

配置mysql 端口号

  1. [root[url=home.php?mod=space&uid=5447]@test[/url] etc]# vi my.cnf
  2. [mysqld]
  3. port=3306 // 加上设置的端口号
  4. datadir=/var/lib/mysql
  5. socket=/var/lib/mysql/mysql.sock
  6. user=mysql
  7. # Disabling symbolic-links is recommended to prevent assorted security risks
  8. symbolic-links=0
  9. [mysqld_safe]
  10. log-error=/var/log/mysqld.log
  11. pid-file=/var/run/mysqld/mysqld.pid
  12. "my.cnf" 11L, 261C written
  13. [root@test etc]#
  14. 4. 重新启动mysql
  15. [root@localhost /]# service mysqld restart
复制代码

查看端口:

  1. mysql> show global variables like 'port';
  2. +---------------+-------+
  3. | Variable_name | Value |
  4. +---------------+-------+
  5. | port | 3306 |
  6. +---------------+-------+
  7. 1 row in set (0.00 sec)
  8. mysql>
复制代码

远程连接可能还会存在防火墙阻断远程连接失败的情况

  1. 加入对应mysql端口的 允许
  2. -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
  3. 结果:
  4. [root@localhost /]# vi /etc/sysconfig/iptables // 打开防火墙配置
  5. # Firewall configuration written by system-config-firewall
  6. # Manual customization of this file is not recommended.
  7. *filter
  8. :INPUT ACCEPT [0:0]
  9. :FORWARD ACCEPT [0:0]
  10. :OUTPUT ACCEPT [0:0]
  11. -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  12. -A INPUT -p icmp -j ACCEPT
  13. -A INPUT -i lo -j ACCEPT
  14. -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
  15. -A INPUT -j REJECT --reject-with icmp-host-prohibited
  16. -A FORWARD -j REJECT --reject-with icmp-host-prohibited
  17. -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
  18. COMMIT
  19. 重启防火墙
  20. [root@localhost /]# service iptables restart
复制代码

如果连接失败 或者 telnet ip port 失败 则关闭防火墙

  1. service iptables stop
  2. // 服务器重启将会失效
复制代码
主从复制配置 1、主从服务器分别作以下操作:
  • 1.1、版本一致
  • 1.2、初始化表,并在后台启动mysql
  • 1.3、修改root的密码
2、修改主服务器master
  1. #vi /etc/my.cnf
  2. [mysqld]
  3. log-bin=mysql-bin //[必须]启用二进制日志
  4. server-id=222 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
复制代码
3、修改从服务器slave:
  1. #vi /etc/my.cnf
  2. [mysqld]
  3. log-bin=mysql-bin //[不是必须]启用二进制日志
  4. server-id=226 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
复制代码
4、重启两台服务器的mysql
  1. /etc/init.d/mysql restart
复制代码
5、在主服务器上建立帐户并授权slave:
  1. #/usr/local/mysql/bin/mysql -uroot -pmttang
  2. mysql>GRANT REPLICATION SLAVE ON *.* to 'mysync'@'%' identified by 'q123456';
  3. //一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.1 45.226,加强安全。
复制代码
6、登录主服务器的mysql,查询master的状态
  1. mysql>show master status;
  2. +------------------+----------+--------------+------------------+
  3. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
  4. +------------------+----------+--------------+------------------+
  5. | mysql-bin.000004 | 308 | | |
  6. +------------------+----------+--------------+------------------+
  7. 1 row in set (0.00 sec)
  8. 注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
复制代码
7、从服务器设置普通用户只读模式
  1. mysql>create user 'test'@'%' identified by '123456'; // 创建普通用户,可以远程连接
  2. mysql> grant select on *.* to test@'%'identified by '123456'; //授权所有库,只能查询操作
  3. mysql> grant all privileges on *.* to test@'%'identified by '123456'; //这是授予所有权限
复制代码
  • 关于mysql创建用户以及权限,下面有详细说明;这里只是做了主从复制避免从库添加数据做准备;
  • 从库远程登录就用刚才设置的普通的只要查询权限的账号去登录,避免导致主从出错
8、配置从服务器Slave:
  1. mysql>change master to master_host='192.168.145.222',master_user='mysync',master_password='q123456',
  2. master_log_file='mysql-bin.000004',master_log_pos=308; //注意不要断开,308数字前后无单引号。
  3. Mysql>start slave; //启动从服务器复制功能
  4. change master to master_host='192.168.80.131',master_user='mysync',master_password='q123456',master_log_file='mysql-bin.000001',master_log_pos=251;
复制代码
9、检查从服务器复制功能状态:
  1. mysql> show slave status\G
  2. *************************** 1. row ***************************
  3. Slave_IO_State: Waiting for master to send event
  4. Master_Host: 192.168.2.222 //主服务器地址
  5. Master_User: mysync //授权帐户名,尽量避免使用root
  6. Master_Port: 3306 //数据库端口,部分版本没有此行
  7. Connect_Retry: 60
  8. Master_Log_File: mysql-bin.000004
  9. Read_Master_Log_Pos: 600 //#同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
  10. Relay_Log_File: ddte-relay-bin.000003
  11. Relay_Log_Pos: 251
  12. Relay_Master_Log_File: mysql-bin.000004
  13. Slave_IO_Running: Yes //此状态必须YES
  14. Slave_SQL_Running: Yes //此状态必须YES
  15. ......
  16. 注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。
  17. 以上操作过程,主从服务器配置完成。
复制代码
10、MySQL添加用户、删除用户与授权详细说明;
  • 1.新建用户
  1. mysql> insert into mysql.user(Host,User,Password) values("localhost","test",password("1234"));
  2. 这样就创建了一个名为:test 密码为:1234 的用户。
  3. 注意:此处的"localhost",是指该用户只能在本地登录,不能在另外一台机器上远程登录。
  4. 如果想远程登录的话,
  5. 将"localhost"改为"%",表示在任何一台电脑上都可以登录。也可以指定某台机器可以远程登录。
复制代码
  • 2.为用户授权
  1. 授权格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码"; 
  2. 2.1 登录MYSQL(有ROOT权限),这里以ROOT身份登录:
  3. @>mysql -u root -p
  4. @>密码
复制代码
  1. 2.2 首先为用户创建一个数据库(testDB):
  2. mysql>create database testDB;
复制代码
  1. 2.3 授权test用户拥有testDB数据库的所有权限(某个数据库的所有权限):
  2. mysql>grant all privileges on testDB.* to test@localhost identified by '1234';
  3. mysql>flush privileges;//刷新系统权限表
  4. 格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码"; 
复制代码
  1. 2.4 如果想指定部分权限给一用户,可以这样来写:
  2. mysql>grant select,update on testDB.* to test@localhost identified by '1234';
  3. mysql>flush privileges; //刷新系统权限表
复制代码
  1. 2.5 授权test用户拥有所有数据库的某些权限:  
  2. mysql>grant select,delete,update,create,drop on *.* to test@"%" identified by "1234";
  3. //test用户对所有数据库都有select,delete,update,create,drop 权限。
  4. //@"%" 表示对所有非本地主机授权,不包括localhost。
  5. (localhost地址设为127.0.0.1,如果设为真实的本地地址,不知道是否可以,没有验证。)
  6. //对localhost授权:
  7. 加上一句grant all privileges on testDB.* to test@localhost identified by '1234';即可。
复制代码
  • 3、删除用户
  1. @>mysql -u root -p
  2. @>密码
  3. mysql>Delete FROM user Where User='test' and Host='localhost';
  4. mysql>flush privileges;
  5. mysql>drop database testDB; //删除用户的数据库
  6. 删除账户及权限:>drop user 用户名@'%';
  7.         >drop user 用户名@ localhost;
复制代码
  • 其他mysql操作
  1. 5. 列出所有数据库
  2.   mysql>show database;
  3. 6. 切换数据库
  4.   mysql>use '数据库名';
  5. 7. 列出所有表
  6.   mysql>show tables;
  7. 8. 显示数据表结构
  8.   mysql>describe 表名;
  9. 9. 删除数据库和数据表
  10.   mysql>drop database 数据库名;
  11.   mysql>drop table 数据表名;
复制代码
11、主从服务器测试
  1. 主服务器Mysql,建立数据库,并在这个库中建表插入一条数据:
  2. mysql> create database hi_db;
  3. Query OK, 1 row affected (0.00 sec)
  4. mysql> use hi_db;
  5. Database changed
  6. mysql> create table hi_tb(id int(3),name char(10));
  7. Query OK, 0 rows affected (0.00 sec)
  8. mysql> insert into hi_tb values(001,'bobu');
  9. Query OK, 1 row affected (0.00 sec)
  10. mysql> show databases;
  11. +--------------------+
  12. | Database |
  13. +--------------------+
  14. | information_schema |
  15. | hi_db |
  16. | mysql |
  17. | test |
  18. +--------------------+
  19. 4 rows in set (0.00 sec)
  20. 从服务器Mysql查询:
  21. mysql> show databases;
  22. +--------------------+
  23. | Database |
  24. +--------------------+
  25. | information_schema |
  26. | hi_db | //I'M here,大家看到了吧
  27. | mysql |
  28. | test |
  29. +--------------------+
  30. 4 rows in set (0.00 sec)
  31. mysql> use hi_db
  32. Database changed
  33. mysql> select * from hi_tb; //查看主服务器上新增的具体数据
  34. +------+------+
  35. | id | name |
  36. +------+------+
  37. | 1 | bobu |
  38. +------+------+
  39. 1 row in set (0.00 sec)
复制代码
12、完成:
  1. 编写一shell脚本,用nagios监控slave的两个yes(Slave_IO及Slave_SQL进程),如发现只有一个或零个yes,就表明主从有问题了,发短信警报吧。
复制代码


回复

使用道具 举报