一、下载通用安装二进制包
先下载mysql安装包:打开 http://dev.mysql.com/downloads/mysql/
选择 linux - Generic并在其下选择
Linux - Generic (glibc 2.5) (x86, 64-bit), Compressed TAR Archive
进行下载。可以先下载到一个临时目录里,解压后,得到两个包:
mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz
mysql-test-5.7.11-linux-glibc2.5-x86_64.tar.gz
只需要mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz 这个包就行了。
scp mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz @192.168.8.242:/opt/soft/
二、建立用户和目录
建立用户mysql,组mysql。后面mysql就使用这个用户来运行(注意这也是mysql启动脚本中默认的用户,因此最好不要改名)。
#groupadd mysql
#useradd -r -g mysql mysql
(使用-r参数表示mysql用户是一个系统用户,不能登录)
建立目录/data/db,后面mysql就安装在这个目录下面。
#mkdir -p /data/db
sudo chmod -R 777 /data/
三、安装
【解压】
将前面得到的mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz解压至/data/db目录下
#tar zxvf mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz -C /data/db
cd /data/db/
这时在program下得到的目录名很长,如果不想改名,则可以建立一个联接:
#ln -s mysql-5.7.21-linux-glibc2.12-x86_64 mysql
此后就可以用/data/db/mysql来找到mysql的安装目录了
cd /data/db/mysql
mkdir data
sudo chmod -R 777 data/
注意,如果mysql目录下没有data目录,手动建一个。
【目录权限设置】
将mysql及其下所有的目录所有者和组均设为mysql:
#cd /data/db/mysql
#chown mysql:mysql -R .
【初始化】
#/data/db/mysql/bin/mysqld --initialize --user=mysql --datadir=/data/db/mysql/data --basedir=/data/db/mysql
/data/db/mysql/bin/mysqld --user=mysql --basedir=/data/db/mysql/data --datadir=/data/db/mysql --initialize
注意:
- data目录解压后没有,需要手动建立(见上文);
- mysql5.7和之前版本不同,很多资料上都是这个命令
…/scripts/mysql_install_db --user=mysql
而5.7版本根本没有这个。
初始化成功后出现如下信息:
201x-xx-xxT07:10:13.583130Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
201x-xx-xx T07:10:13.976219Z 0 [Warning] InnoDB: New log files created, LSN=45790
201x-xx-xx T07:10:14.085666Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
201x-xx-xx T07:10:14.161899Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 1fa941f9-effd-11e5-b67d-000c2958cdc8.
201x-xx-xx T07:10:14.165534Z 0 [Warning] Gtid table is not ready to be used. Table ‘mysql.gtid_executed’ cannot be opened.
201x-xx-xx T07:10:14.168555Z 1 [Note] A temporary password is generated for root@localhost: q1SLew5T_6K,
2017-11-01T04:30:34.141866Z 0 [Warning] Gtid table is not ready to be used. Table ‘mysql.gtid_executed’ cannot be opened.
2017-11-01T04:30:34.142585Z 1 [Note] A temporary password is generated for root@localhost: cdBXBmSBp6&l
A temporary password is generated for root@localhost: rDL3E2wkrO.1
A temporary password is generated for root@localhost: Bdzage-.=0BJ
A temporary password is generated for root@localhost: 8xs85Y<G#5uj
注意最后一行,这也是和之有版本不同的地方,它给了root一个初始密码,后面要登录的时候要用到这个密码。
root@localhost: #i(KCQX<a6Hk
root@localhost: E?h-zwt%k3!t
不需要复制了—【配置】
将mysql/support-files下的my-default.cnf改名为my.cnf,拷到/etc下(或者考到{mysql}下,然后作一个软链接到/etc下):
#cp /data/db/mysql/support-files/my-default.cnf /etc/my.cnf
my.cnf中关键配置:
[mysqld]
basedir = /data/db/mysql
datadir = /data/db/mysql/data
port = 3307i
socket = /data/db/mysql/tmp/mysql.sock
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
注意,tmp目录不存在,请创建之。
cd /data/db/mysql
mkdir tmp
sudo chmod -R 777 tmp/
chown mysql:mysql -R tmp/
如果不把my.cnf拷到/etc下,运行时会出现:
mysqld: Can’t change dir to ‘/usr/local/mysql/data/’ (Errcode: 2 - No such file or directory)
这样的出错提示,说明它没找到my.cnf中的配置;而去找了程序编译时的默认安装位置:/usr/local/mysql
vi /etc/my.cnf
------默认的-------
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
------修改后node1-------
[mysql]
default-character-set=utf8
[client]
port = 3307
socket = /data/db/mysql/tmp/mysql.sock
[mysqld]
basedir = /data/db/mysql
datadir = /data/db/mysql/data
port = 3307
socket = /data/db/mysql/tmp/mysql.sock
character-set-server=utf8
server-id=1033307
relay-log=relay-log.log
binlog_format=ROW
#log_slave_updates=true #MySQL5.7可以不启用此参数,5.7版本使用了gtid_executed表记录同步复制的信息,避免两次写入relay-log和binlog,降低了从库磁盘I/O
gtid_mode=on
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
sync_master_info=1
slave_parallel_workers=2
binlog_checksum=CRC32
master_verify_checksum=1
slave_sql_verify_checksum=1
binlog_rows_query_log_events=1
log_bin=mysql-bin.log
#replicate_do_db=tt
slave_parallel_type=logical_clock #MySQL5.7新增加的值,配置基于表的组提交并行复制,默认值为database(基于库进行多线程复制,MySQL5.6是基于库的方式进行多线程方式复制)建议改为logical_clock,基于表的组方式复制,提高复制的效率。
max_allowed_packet = 512M
lower_case_table_names = 1
sql_mode=strict_trans_tables,error_for_division_by_zero,no_auto_create_user,no_engine_substitution
log_bin_trust_function_creators = 1
------修改后node2-------
[mysql]
default-character-set=utf8
[client]
port = 3307
socket = /data/db/mysql/tmp/mysql.sock
[mysqld]
basedir = /data/db/mysql
datadir = /data/db/mysql/data
port = 3307
socket = /data/db/mysql/tmp/mysql.sock
character-set-server=utf8
server-id=1043307
relay-log=relay-log.log
binlog_format=ROW
#log_slave_updates=true #MySQL5.7可以不启用此参数,5.7版本使用了gtid_executed表记录同步复制的信息,避免两次写入relay-log和binlog,降低了从库磁盘I/O
gtid_mode=on
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
sync_master_info=1
slave_parallel_workers=2
binlog_checksum=CRC32
master_verify_checksum=1
slave_sql_verify_checksum=1
binlog_rows_query_log_events=1
log_bin=mysql-bin.log
#replicate_do_db=tt
slave_parallel_type=logical_clock #MySQL5.7新增加的值,配置基于表的组提交并行复制,默认值为database(基于库进行多线程复制,MySQL5.6是基于库的方式进行多线程方式复制)建议改为logical_clock,基于表的组方式复制,提高复制的效率。
max_allowed_packet = 512M
lower_case_table_names = 1
sql_mode=strict_trans_tables,error_for_division_by_zero,no_auto_create_user,no_engine_substitution
log_bin_trust_function_creators = 1
show variables like ‘%log_bin_trust_function_creators%’;
四、运行
【运行服务器程序】
#./bin/mysqld_safe&
注:在这个启动脚本里已默认设置–user=mysql;在脚本末尾加&表示设置此进程为后台进程,区别就是在控制台输入bg,即可将当前进程转入后台,当前shell可进行其他操作。
【停止mysql】
./bin/mysqladmin -uroot -p
(注意此时的root是指mysql的root用户)
五、设置mysql以服务运行并且开机启动
将{mysql}/support-files/mysql.server 拷贝为/etc/init.d/mysql并设置运行权限
#cp ./support-files/mysql.server /etc/init.d/mysql
#chmod +x /etc/init.d/mysql
把mysql注册为开机启动的服务
#chkconfig --add mysql
当然也可以手动进行服务的开启和关闭:
chown -R mysql.mysql /data/db/mysql/data
#/etc/init.d/mysql start
#/etc/init.d/mysql stop
/etc/init.d/mysql restart
六、客户端连接测试
cd /data/db/mysql
#./bin/mysql -uroot -p
此时要求输入密码,就是前面初始化时生成的密码。
alter user user() identified by “XXXXXX”; 修改密码
这时如果连接服务的时候出现错误:
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)
则需要在在my.cnf中填加:
[client]
socket = /data/db/mysql/tmp/mysql.sock
连上后,在做任何操作前,mysql要求要改掉root的密码后才能进行操作。
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> alter user ‘root’@‘localhost’ identified by ‘faWu1qazXSW@’;
3、先搭建已10.236.2.28为主,10.236.2.38为从的主从架构,然后再配置双主的机构模型
①在103上创建104的复制用户
mysql>create user fawusyn2@‘10.236.2.38’ identified by ‘fawusyn1qazXSW’;
mysql>grant replication slave on . to fawusyn2@‘10.236.2.38’;
②在10.236.2.38上执行复制操作,gtid配置命令如下:
create user fawusyn2@‘10.236.2.38’ identified by ‘fawusyn1qazXSW’;
change master to master_host=‘10.0.0.33’, master_user=‘fawusyn2’, master_password=‘fawusyn1qazXSW’, master_port=3307, master_auto_position=1;
show slave status\G;
4、上述已经以103为主,104为从的设置完毕后,
再在其基础上设置104节点为主,103为从的配置
在103主节点上创建新的用户(※这点很重要,因为之前已经是主从配置,在103节点上创建会自动同步至104上,如果在104上创建用户,可能会导致两节点数据不一致情况发生)
mysql>create user fawusyn1@‘10.236.2.28’ identified by ‘fawusyn1qazXSW’;
mysql>grant replication slave on . to fawusyn1@‘10.236.2.28’;
5、然后在10.236.2.28上执行复制命令操作:
mysql>change master to master_host=‘10.236.2.38’, master_user=‘fawusyn1’, master_password=‘fawusyn1qazXSW’, master_port=3307, master_auto_position=1;
6、启动设置的10.236.2.28节点为从的配置
mysql>start slave;
7、查看配置情况:
mysql>show slave status\G;
8、测试配置:
①在192.168.0.103上
create database aaa;
use aaa;
create table a1 (id int,name varchar(12));
insert into a1 values (103,‘103a’);
②分别在103、104库上进行查看数据
两个库上数据库和表以及数据都存在!
==============================================================
③在192.168.0.104上
use mysql;
create database bbb;
use bbb;
create table b1 (id int,name varchar(12));
insert into b1 values (104,‘104b’);
④分别在103、104库上进行查看数据
七、TIPS
【查看mysql是否运行】
ps -ef|grep mysqld
netstat -lnp | grep -i mysql
【mysql启动时读取配置文件my.cnf的顺序】
可以运行如下命令查看:
./bin/mysqld --verbose --help |more
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
可以看到,启动时可以从上述目录下读取配置文件my.cnf。如果当前my.cnf文件不位于上述位置,则必须考过去或做链接。
3、实现远程连接(改表法)
mysql -u root -p
use mysql;
update user set host = ‘%’ where user = ‘root’;
flush privileges;
select * from user;
这样在远端就可以通过root用户访问Mysql.
select uuid();
c4149c12-ecf4-11ea-b169-3ce8246a5c48
find / -name ‘auto.cnf’
sudo vi /data/db/mysql/data/auto.cnf
f67afcb0-ecf5-11ea-bf3f-3ce8246a5c60
mysql备份
mysqldump --add-drop-table -uadmin -pADpass0o0_ lhims09|gzip > /data/backup/backupfile_lhims09_date +%F
.sql.gz
mysqldump tkdata -uroot -pmlaw@2019Tw > tkdata_all.sql
/data/db/mysql/bin/mysql -uroot -pmlaw@2019Tw tkdata< tkdata_all1117.sql
– mysql导出视图以及表结构
mysqldump -ucsfdp -pcsfdp -d web_cdp > web_cdp_20110906.sql
– 只导出数据不导出表结构
mysqldump -t csf_home -uroot -p123456 > data.sql
三、导出存储过程及函数
1、查询数据库中的存储过程和函数
方法一:
select name
from mysql.proc where db = ‘databasename’ and type
= ‘PROCEDURE’; // 存储过程
select name
from mysql.proc where db = ‘databasename’ and type
= ‘FUNCTION’ // 函数
方法二:
show procedure status;
show function status;
2、mysql导出存储过程及函数
执行命令: mysqldump -hhostname -uusername -ppassword -ntd -R databasename > prorandfunc.sql
mysqldump -uroot -pmlaw@2019*Tw -ntd -R tkdata > tkdata_func1117.sql
四、总结
-d 结构(--no-data:不导出任何数据,只导出数据库表结构)
-t 数据(--no-create-info:只导出数据,而不添加CREATE TABLE 语句)
-n (--no-create-db:只导出数据,而不添加CREATE DATABASE 语句)
-R (--routines:导出存储过程以及自定义函数)
-E (--events:导出事件)
--triggers (默认导出触发器,使用--skip-triggers屏蔽导出)
-B (--databases:导出数据库列表,单个库时可省略)
--tables 表列表(单个表时可省略)
①同时导出结构以及数据时可同时省略-d和-t
②同时 不 导出结构和数据可使用-ntd
③只导出存储过程和函数可使用-R -ntd
④导出所有(结构&数据&存储过程&函数&事件&触发器)使用-R -E(相当于①,省略了-d -t;触发器默认导出)
⑤只导出结构&函数&事件&触发器使用 -R -E -d
数据导入
注意法务数据库字符集tkdata数据库是latin1 – cp1252 West European
show variables like ‘character_set_%’;
mysql -u用户名 -p密码 数据库名 < 数据库名.sql
/data/db/mysql/bin/mysql -uroot -pmlaw@2019*Tw tkdata< tkdata.sql
/data/db/mysql/bin/mysql -uroot -pfaWu1qazXSW@ usermanager< usermanager.sql
tkdata 表447
视图 75
函数 37
导入报错问题表
t_license_apply
t_uint_company
t_uint_company1111
问题字段
createTime
CURRENT_TIMESTAMP
Cratetime
timestamp(0) DEFAULT NULL COMMENT ‘创建时间’,
Cratetime
timestamp NULL DEFAULT NULL COMMENT ‘创建时间’,
外键设置
mysql禁用外键约束: SET FOREIGN_KEY_CHECKS=0;
mysql启动外键约束: SET FOREIGN_KEY_CHECKS=1;
查看当前FOREIGN_KEY_CHECKS值:SELECT @@FOREIGN_KEY_CHECKS;
mysql删除外键约束:alter table table_name drop foreign key foreign_key_name;
28
reset master;
stop slave;
reset slave;
change master to master_host=‘10.236.2.38’, master_user=‘fawusyn1’, master_password=‘fawusyn1qazXSW’, master_port=3307, master_auto_position=1;
start slave;
show slave status\G;
不要这个
set global gtid_purged=‘c4149c12-ecf4-11ea-b169-3ce8246a5c48:3’;
38
reset master;
stop slave;
reset slave;
change master to master_host=‘10.236.2.28’, master_user=‘fawusyn2’, master_password=‘fawusyn1qazXSW’, master_port=3307, master_auto_position=1;
start slave;
show slave status\G;
不要这个
set global gtid_purged=‘f67afcb0-ecf5-11ea-bf3f-3ce8246a5c60:368’;
新的 mysql5.7 账号root 密码 faWu1qazXSW@ 端口3307,ip是10.236.2.28(优先连接这个节点)和10.236.2.38 双向同步的
CHANGE MASTER TO MASTER_HOST=‘10.0.0.33’,MASTER_USER=‘root’,MASTER_PASSWORD=‘root’,MASTER_LOG_FILE=‘mysql-bin.000001’,MASTER_LOG_POS=311;
CHANGE MASTER TO MASTER_HOST=‘10.0.0.33’, MASTER_PORT=3307, MASTER_USER=‘root’, MASTER_PASSWORD=‘root’, MASTER_LOG_FILE=‘mysql-bin.000001’, MASTER_LOG_POS=311;
编辑主从
在【主库】输入 show master status\G; 查看状态
从库设置
stop slave; #暂停
reset slave; #重置
change master to master_host="主机IP", master_user="copy",master_password="copy",master_log_file="db-binlog.000002",master_log_pos=2532; #设置和主机同步的用户信息,日志文件信息
change master to master_host="10.0.0.33", master_port=3307 , master_user="root",master_password="uacWade*@$$!",master_log_file="mysql-bin.000021",master_log_pos=409842070;
start slave; #启动
show slave status \G #查看从机状态,主要是看 Slave_IO_Running Slave_SQL_Running 上是否都是 yes
在【从库】输入 show slave status\G;
此时的状态表示主从连接成功