mysql的多表查询以及用户权限管理

时间:2023-02-23 16:22:45

今天分享的是mysql多表查询中相关连接的分享,其中包括左外连接、右外连接、完全外连接等。并且分享用户权限的管理和一些函数的应用,以及用mysql搭建相关网站


多表查询

自然连接:去掉重复列的等值连接

  • 外连接:左外连接、右外连接、完全外连接
  • 自连接

子查询

子查询 subquery 即SQL语句调用另一个SELECT子句,可以是对同一张表,也可以是对不同表,主要有以下 四种常见的用法.

  1. 用于比较表达式中的子查询;子查询仅能返回单个值
SELECT Name,Age FROM students WHERE Age>(SELECT avg(Age) FROM teachers);
update students set Age=(SELECT avg(Age) FROM teachers) where stuid=25;
  1. 用于IN中的子查询:子查询应该单独查询并返回一个或多个值重新构成列表
SELECT Name,Age FROM students WHERE Age IN (SELECT Age FROM teachers);
MariaDB [hellodb]> select * from students s where  EXISTS (select * from
teachers t where s.teacherid=t.tid);
+-------+-------------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+-------------+-----+--------+---------+-----------+
| 1 | Shi Zhongyu | 22 | M | 2 | 3 |
| 4 | Ding Dian | 32 | M | 4 | 4 |
| 5 | Yu Yutong | 26 | M | 3 | 1 |
+-------+-------------+-----+--------+---------+-----------+
#说明:
1、EXISTS (或 NOT EXISTS) 用在 where之后,且后面紧跟子查询语句(带括号)
2、EXISTS (或 NOT EXISTS) 只关心子查询有没有结果,并不关心子查询的结果具体是什么
3、上述语句把students的记录逐条代入到Exists后面的子查询中,如果子查询结果集不为空,即说明
存在,那么这条students的记录出现在最终结果集,否则被排除
MariaDB [hellodb]> select * from students s where NOT EXISTS (select * from
teachers t where s.teacherid=t.tid);
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------
  1. 用于FROM子句中的子查询
    使用格式:
SELECT tb_alias.col1,... FROM (SELECT clause) AS tb_alias WHERE Clause; 

SELECT s.ClassID,s.aage FROM (SELECT ClassID,avg(Age) AS aage FROM students
WHERE ClassID IS NOT NULL GROUP BY ClassID) AS s WHERE s.aage>30;

子查询优化

子查询可以一次性完成很多逻辑上需要多个步骤才能完成的SQL操作。子查询虽然可以使查询语句很灵活,但
执行效率不高。执行子查询时,需要为内层查询语句的查询结果建立一个临时表。然后外层查询语句从临时表
中查询记录。查询完毕后,再撤销这些临时表。因此,子查询的速度会受到一定的影响。如果查询的数据量比
较大,这种影响就会随之增大。
可以使用连接(JOIN)查询来替代子查询。连接查询不需要建立临时表,其速度比子查询要快,如果查询中使用
到索引的话,性能会更好。
联合查询Union

联合查询 Union 实现的条件,多个表的字段数量相同,字段名和数据类型可以不同,但一般数据类型是相同 的.

SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers

范例:联合查询

#多表纵向合并union
MariaDB [hellodb]> select * from teachers union select * from students;
MariaDB [hellodb]> select tid as id,name,age,gender from teachers union select
stuid,name,age,gender from students;
+----+---------------+-----+--------+
| id | name | age | gender |
+----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 26 | F |
| 1 | Shi Zhongyu | 22 | M |
| 2 | Shi Potian | 22 | M |
| 3 | Xie Yanke | 53 | M |
| 4 | Ding Dian | 32 | M |
| 5 | Yu Yutong | 26 | M |
| 6 | Shi Qing | 46 | M |
| 7 | Xi Ren | 19 | F |
| 8 | Lin Daiyu | 17 | F |
| 9 | Ren Yingying | 20 | F |
| 10 | Yue Lingshan | 19 | F |
| 11 | Yuan Chengzhi | 23 | M |
| 12 | Wen Qingqing | 19 | F |
| 13 | Tian Boguang | 33 | M |
| 14 | Lu Wushuang | 17 | F |
| 15 | Duan Yu | 19 | M |
| 16 | Xu Zhu | 21 | M |
| 17 | Lin Chong | 25 | M |
| 18 | Hua Rong | 23 | M |
| 19 | Xue Baochai | 18 | F |
| 20 | Diao Chan | 19 | F |
| 21 | Huang Yueying | 22 | F |
| 22 | Xiao Qiao | 20 | F |
| 23 | Ma Chao | 23 | M |
| 24 | Xu Xian | 27 | M |
| 25 | Sun Dasheng | 100 | M |
| 26 | xietingfeng | 23 | M |
| 27 | liudehua | 18 | F |
| 28 | mahuateng | 20 | M |
| 29 | wuyanzu | 19 | M |
| 30 | wuxin | 21 | M |
| 31 | Song Jiang | 45 | M |
| 32 | Zhang Sanfeng | 18 | M |
| 33 | Miejue Shitai | 18 | F |
| 34 | Lin Chaoying | 18 | F |
| 35 | 巴西可 | 20 | M |
| 36 | abc | 20 | M |
+----+---------------+-----+--------+
40 rows in set (0.001 sec)

范例: 去重记录

mysql> select * from emp;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | mage | 20 | M |
| 4 | li | 22 | F |
| 3 | mage | 20 | M |
+-----+---------------+-----+--------+
5 rows in set (0.00 sec)
mysql> select distinct * from emp;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | mage | 20 | M |
| 4 | li | 22 | F |
+-----+---------------+-----+--------+
4 rows in set (0.00 sec)
mysql> select * from emp union select * from emp;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | mage | 20 | M |
| 4 | li | 22 | F |
+-----+---------------+-----+--------+
4 rows in set (0.00 sec)
#union all 不去重
mysql> select * from emp union all select * from emp;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | mage | 20 | M
交叉连接cross join

cross join 即多表的记录之间做笛卡尔乘积组合,并且多个表的列横向合并相加, "雨露均沾" 比如: 第一个表3行4列,第二个表5行6列,cross join后的结果为3*5=15行,4+6=10列 交叉连接生成的记录可能会非常多,建议慎用

范例:交叉连接

#横向合并,交叉连接(横向笛卡尔)
MariaDB [hellodb]> select * from students cross join teachers;
MariaDB [hellodb]> select * from teachers , students;
+-----+---------------+-----+--------+-------+---------------+-----+--------+----
-----+-----------+
| TID | Name | Age | Gender | StuID | Name | Age | Gender |
ClassID | TeacherID |
+-----+---------------+-----+--------+-------+---------------+-----+--------+----
-----+-----------+
| 1 | Song Jiang | 45 | M | 1 | Shi Zhongyu | 22 | M |
2 | 3 |
| 2 | Zhang Sanfeng | 94 | M | 1 | Shi Zhongyu | 22 | M |
2 | 3 |
| 3 | Miejue Shitai | 77 | F | 1 | Shi Zhongyu | 22 | M |
2 | 3 |
| 4 | Lin Chaoying | 26 | F | 1 | Shi Zhongyu | 22 | M |
2 | 3 |
| 1 | Song Jiang | 45 | M | 2 | Shi Potian | 22 | M |
1 | 7 |
| 2 | Zhang Sanfeng | 94 | M | 2 | Shi Potian | 22 | M |
1 | 7 |
| 3 | Miejue Shitai | 77 | F | 2 | Shi Potian | 22 | M |
1 | 7 |
| 4 | Lin Chaoying | 26 | F | 2 | Shi Potian | 22 | M |
1 | 7 |
| 1 | Song Jiang | 45 | M | 3 | Xie Yanke | 53 | M |
2 | 16 |
| 2 | Zhang Sanfeng | 94 | M | 3 | Xie Yanke | 53 | M |
2 | 16 |
| 3 | Miejue Shitai | 77 | F | 3 | Xie Yanke | 53 | M |
2 | 16 |
| 4 | Lin Chaoying | 26 | F | 3 | Xie Yanke | 53 | M |
2 | 16 |
| 1 | Song Jiang | 45 | M | 4 | Ding Dian | 32 | M |
内连接 inner join

inner join 内连接取多个表的交集 范例:内连接

MariaDB [hellodb]> select s.name 学生姓名,s.age 学生年龄,s.gender 学生性别,t.name 老
师姓名,t.age 老师年龄,t.gender 老师性别 from students s inner join teachers t on
s.gender <> t.gender;
MySQL root@(none):hellodb> select stuid,s.name,tid,t.name from studen
-> ts s,teachers t
-> where s.teacherid=t.tid;
+-------+-------------+-----+---------------+
| stuid | name | tid | name |
+-------+-------------+-----+---------------+
| 1 | Shi Zhongyu | 3 | Miejue Shitai |
| 4 | Ding Dian | 4 | Lin Chaoying |
| 5 | Yu Yutong | 1 | Song Jiang |
+-------+-------------+-----+---------------+

3 rows in set
Time: 0.011s

MariaDB [hellodb]> select stuid,s.name,tid,t.name from students s,teachers t
where s.teacherid=t.tid;
+-------+-------------+-----+---------------+
| stuid | name | tid | name |
+-------+-------------+-----+---------------+
| 5 | Yu Yutong | 1 | Song Jiang |
| 1 | Shi Zhongyu | 3 | Miejue Shitai |
| 4 | Ding Dian | 4 | Lin Chaoying |
+-------+-------------+-----+---------------+
3 rows in set (0.00 sec)
#内连接后过滤数据
MariaDB [hellodb]> select * from students s inner join teachers t on
s.teacherid=t.tid and s.age > 30 ;
自然连接 natural join
  • 当源表和目标表共享相同名称的列时,就可以在它们之间执行自然连接,而无需指定连接列。
  • 在使用纯自然连接时,如没有相同的列时,会产生交叉连接(笛卡尔乘积)
MariaDB [db1]> create table t1 ( id int,name char(20));
MariaDB [db1]> create table t2 ( id int,title char(20));
MariaDB [db1]> insert t1 values(1,'mage'),(2,'wang'),(3,'zhang');
MariaDB [db1]> insert t2 values(1,'ceo'),(2,'cto');
MariaDB [db1]> select * from t1;
+------+-------+
| id | name |
+------+-------+
| 1 | mage |
| 2 | wang |
| 3 | zhang |
+------+-------+
3 rows in set (0.00 sec)
MariaDB [db1]> select * from t2;
+------+-------+
| id | title |
+------+-------+
| 1 | ceo |
| 2 | cto |
+------+-------+
2 rows in set (0.00 sec)
MariaDB [db1]> select * from t1 NATURAL JOIN t2;
+------+------+-------+
| id | name | title |
+------+------+-------+
| 1 | mage | ceo |
| 2 | wang | cto |
+------+------+-------+
2 rows in set (0.00 sec)
MariaDB [db1]> select t1.name,t2.title from t1 NATURAL JOIN t2;
+------+-------+
| name | title |
+------+-------+
| mage | ceo |
| wang | cto |
+------+-------+
2 rows in set (0.00 sec)
左( left outer join )和右(right outer join)外连接

左连接: 以左表为主根据条件查询右表数据﹐如果根据条件查询右表数据不存在使用null值填充

右连接: 以右表为主根据条件查询左表数据﹐如果根据条件查询左表数据不存在使用null值填充

完全外连接 full outer join

MySQL 不支持完全外连接full outer join语法

自连接 inner join

自连接, 即表自身连接自身

inner join在空表的情况下就没了,这样情况下直接用left join

​可以直接把l.name​​ leader_name 换成 ifnull(​​l.name​​,'无上级') 上级领导姓名

SELECT 语句处理的顺序

视图:虚拟表,保存有实表的查询结果,相当于别名

利用视图,可以隐藏表的真实结构,在程序中利用视图进行查询,可以避免表结构的变化,而修改程序,降低程 序和数据库之间的耦合度

创建方法:

CREATE   VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

查看视图定义:

SHOW CREATE VIEW view_name #只能看视图定义
SHOW CREATE TABLE view_name # 可以查看表和视图

删除视图:

DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]

注意:视图中的数据事实上存储于"基表"中,因此,其修改操作也会针对基表实现;其修改操作受基表 限制

mysql> show table status like 'students'\G;
*************************** 1. row ***************************
Name: students
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 25
Avg_row_length: 655
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: 26
Create_time: 2022-11-08 17:30:29
Update_time: 2022-11-10 15:48:41
Check_time: NULL
Collation: utf8mb3_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)

ERROR:
No query specified
[root@centos8 ~]#ls /var/lib/mysql/hellodb/
classes.frm coc.ibd db.opt students.frm teachers.ibd
v_old_student.frm
classes.ibd courses.frm scores.frm students.ibd toc.frm v_st_co_sc.frm
coc.frm courses.ibd scores.ibd teachers.frm toc.ibd

function 函数

函数:分为系统内置函数和自定义函数

  • 系统内置函数参考:
https://dev.mysql.com/doc/refman/8.0/en/built-in-function-reference.html

自定义函数:user-defined function UDF,保存在mysql.proc (MySQL8.0 中已经取消此表)表中

创建UDF语法
CREATE [AGGREGATE] FUNCTION function_name(parameter_name type,[parameter_name 
type,...])
RETURNS {STRING|INTEGER|REAL}
runtime_body

说明:

  • 参数可以有多个,也可以没有参数
  • 无论有无参数,小括号()是必须的
  • 必须有且只有一个返回值

查看函数列表:

SHOW FUNCTION STATUS;

查看函数定义

SHOW CREATE FUNCTION function_name

删除UDF

DROP FUNCTION function_name

调用自定义函数语法

SELECT function_name(parameter_value,...)
#更改命令使其允许使用函数
#默认MySQL8.0开启二进制日志,而不允许创建函数
mysql> select @@log_bin;
+-----------+
| @@log_bin |
+-----------+
| 1 |
+-----------+
1 row in set (0.00 sec)
mysql> show variables like 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | OFF |
+---------------------------------+-------+
1 row in set (0.00 sec)
#打开此变量允许二进制日志信息函数创建
mysql> set global log_bin_trust_function_creators=ON;
Query OK, 0 rows affected (0.00 sec)
procedure存储过程

存储过程:多表SQL的语句的集合,可以独立执行,存储过程保存在mysql.proc表中

查看存储过程定义

SHOW CREATE PROCEDURE sp_name

调用存储过程

CALL sp_name ([ proc_parameter [,proc_parameter ...]])
trigger触发器 (增加 INSERT和删除DELETE)

创建触发器,在向学生表INSERT数据时,学生数增加,DELETE学生时,学生数减少

Event 事件

MySQL 用户管理

相关数据库和表

元数据数据库:mysql
系统授权表:db, host, user,columns_priv, tables_priv, procs_priv, proxies_priv

用户帐号:

'USERNAME'@'HOST'
@'HOST':可以是下面形式
主机名:
IP地址或Network
通配符: % _
#示例:
wang@'web1.wang.org'
wang@'172.16.%.%'
wang@'10.0.0.%'
wang@'10.0.0.0/255.255.0.0'

创建用户:CREATE USER

CREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY 'password'];
#示例:
create user test@'10.0.0.0/255.255.255.0' identified by '123456';
create user test2@'10.0.0.%' identified by 123456;

新建用户的默认权限:USAGE

用户重命名:RENAME USER

RENAME USER old_user_name TO new_user_name;

删除用户

DROP USER 'USERNAME'@'HOST'

范例:删除默认的空用户

修改密码:

注意:

新版mysql中用户密码可以保存在mysql.user表的authentication_string字段中

如果mysql.user表的authentication_string和password字段都保存密码,authentication_string 优先生效

#方法1,用户可以也可通过此方式修改自已的密码
SET PASSWORD FOR 'user'@'host' = PASSWORD('password'); #MySQL8.0 版本不支持此方法,
因为password函数被取消
set password for root@'localhost'='123456' ; #MySQL8.0版本支持此方法,此方式直接将密码
123456加密后存放在mysql.user表的authentication_string字段
#方法2
ALTER USER test@'%' IDENTIFIED BY 'centos'; #通用改密码方法, 用户可以也可通过此方式修
改自已的密码,MySQL8 版本修改密码
#方法3 此方式MySQL8.0不支持,因为password函数被取消
UPDATE mysql.user SET password=PASSWORD('password') WHERE clause;
#mariadb 10.3
update mysql.user set authentication_string=password('ubuntu') where
user='mage';
#此方法需要执行下面指令才能生效:
FLUSH PRIVILEGES;
#方法4
mysqladmin -uroot -p<oldpassword> password <newpassword>
忘记管理员密码的解决办法:
  1. 启动mysqld进程时,为其使用如下选项:
--skip-grant-tables 
--skip-networking
  1. 使用UPDATE命令修改管理员密码
  2. 关闭mysqld进程,移除上述两个选项,重启mysqld
[root@centos8 ~]#vim /etc/my.cnf
[mysqld]
skip-grant-tables
skip-networking
[root@centos8 ~]#systemctl restart mysqld|mariadb
[root@centos8 ~]#mysql
#方法1
#mariadb 旧版和MySQL5.6版之前
MariaDB [(none)]> update mysql.user set password=password('ubuntu') where
user='root';
#mariadb 新版
MariaDB [(none)]> update mysql.user set authentication_string=password('ubuntu')
where user='root';
#方法2
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> alter user root@'localhost' identified by 'ubuntu';
[root@centos8 ~]#vim /etc/my.cnf
[mysqld]
#skip-grant-tables

#skip-networking
[root@centos8 ~]#systemctl restart mysqld|mariadb
[root@centos8 ~]#mysql -uroot -pubuntu

范例: 删库跑路之清空root密码方法

#此方法适用于包安装方式的MySQL或Mariadb
[root@centos8 ~]#systemctl stop mysqld
[root@centos8 ~]#rm -rf /var/lib/mysql/*
[root@centos8 ~]#systemctl start mysqld

MySQL8.0的密码验证方式

MySQL8.0的密码验证方式发生了变化,添加了caching_sha2_password,导致旧的客户端使用 mysql_native_password旧的验证方式连接失败,可以修改连接

#由服务器选项和系统变量default_authentication_plugin可以指定如下值
mysql_native_password #Rocky8默认值
caching_sha2_password #Ubuntu20.04默认值
#对已存在的用户也可以修改指定用户的密码验证方式
alter user wang@'localhost' identified with mysql_native_password by '123456';
alter user wang@'10.0.0.%' identified with mysql_native_password by '123456';

权限管理和DCL语句

授权:GRANT
GRANT priv_type [(column_list)],... ON [object_type] priv_level TO 'user'@'host' 
[IDENTIFIED BY 'password'] [WITH GRANT OPTION];
priv_type: ALL [PRIVILEGES]
object_type:TABLE | FUNCTION | PROCEDURE
priv_level: *(所有库) |*.* | db_name.* | db_name.tbl_name | tbl_name(当前库的
表) | db_name.routine_name(指定库的函数,存储过程,触发器)
with_option: GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count

参考:​​https://dev.mysql.com/doc/refman/5.7/en/grant.html​

范例: 针对一个电商项目创建项目的管理员用户

mysql> create database eshop;
Query OK, 1 row affected (0.00 sec)
mysql> create user eshop@'10.0.0.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on eshop.* to eshop@'10.0.0.%';
Query OK, 0 rows affected (0.00 sec)
#MySQL5.7版本之前支持
mysql> grant all on eshop.* to eshop@'10.0.0.%' identified by '123456';
取消授权:REVOKE

参考:​​https://dev.mysql.com/doc/refman/5.7/en/revoke.html​

REVOKE DELETE ON *.* FROM 'testuser'@'172.16.0.%';

实现基于LMP架构的Web应用

LAMP 说明

L : Linux

A: Apache Web 服务器

M: MySQL 数据库

P: PHP,Python,Perl 开发语言

![](D:\Typora\Typora\locales\屏幕截图 2022-11-12 095544.png)

/etc/php.ini配置文件格式:

[foo]:Section Header
directive = value

注释符:

  • 以#开头,纯粹的注释信息
  • 以 ; 开头,用于注释可启用的directive

提示:较新的版本中,已经完全使用 “ ; ” 进行注释

php常见设置:

expose_php = On   #响应报文显示首部字段x-powered-by: PHP/x.y.z,暴露php版本,建议为off 
max_execution_time= 30 #最长执行时间30s
memory_limit=128M #生产不够,可调大
display_errors=off #调试使用,不要打开,否则可能暴露重要信息
display_startup_errors=off #建议关闭
post_max_size=8M #最大上传数据大小,生产可能调大,比下面项大
upload_max_filesize =2M #最大上传文件,生产可能要调大
max_file_uploads = 20 #同时上传最多文件数
date.timezone = Asia/Shanghai #指定时区
short_open_tag = On #支持短标签

实现基于LAMP架构的 Wordpress 门户网站实战案例

范例:Ubuntu20.04和Rocky8 实现 LAMP应用门户网站 wordpress 6.1

#数据库准备
apt -y install mysql-server
yum -y install mysql-server;systemctl enable --now mysqld
mysql>
create database wordpress;
create user wordpress@'localhost' identified by '123456';
grant all on wordpress.* to wordpress@'localhost' ;
#Ubuntu20.04系统
apt -y install apache2 php php-mysql php-json
#红帽系统
yum -y install httpd php php-mysqlnd php-json
#Ubuntu PHP优化
vim /etc/php/7.4/apache2/php.ini
#红帽系统 PHP优化
vim /etc/php.ini
post_max_size = 80M
upload_max_filesize = 100M
#Ubuntu系统
systemctl restart apache2
#红帽系统
systemctl enable --now httpd
#解压软件包
[root@ubuntu2004 ~]#unzip latest-zh_CN.zip
[root@ubuntu2004 ~]#ls
latest-zh_CN.zip snap wordpress
#部署wordpress
wget https://cn.wordpress.org/latest-zh_CN.tar.gz
tar xf latest-zh_CN.tar.gz -C /opt/

[root@ubuntu2004 ~]#mv wordpress/* /var/www/html/
[root@ubuntu2004 ~]#ll -d /var/www/html/
drwxr-xr-x 5 root root 4096 11月 7 21:20 /var/www/html//
[root@ubuntu2004 ~]#ps aux
#Ubuntu
[root@ubuntu2004 ~]#chown -R www-data.www-data /var/www/html/
rm -f /var/www/html/index.html
##红帽系统
chown -R apache.apache /var/www/html

实现基于LAMP架构的类京东电商网站实战案例

实现过程范例: Ubuntu20.04 实现 shopxo-2.3.1

#准备数据库
[root@ubuntu2004 ~]#apt -y install mysql-server
[mysqld]
default_authentication_plugin=mysql_native_password
[root@ubuntu2004 ~]#systemctl restart mysql
[root@ubuntu2004 ~]#mysql
mysql>create database shopxo;
mysql>create user shopxo@'localhost' identified by '123456';
mysql>rant all on shopxo.* to shopxo@'localhost' ;
[root@ubuntu2004 ~]#apt -y install apache2 php php-mysql php-json php-gd php-xml
php-pclzip php-curl
[root@ubuntu2004 ~]#vim /etc/php/7.4/apache2/php.ini
post_max_size = 100M
upload_max_filesize = 100M
date.timezone = Asia/Shanghai
[root@ubuntu2004 ~]#systemctl restart apache2
[root@ubuntu2004 ~]#wget
https://github.com/gongfuxiang/shopxo/archive/v2.3.1.zip
[root@ubuntu2004 ~]#unzip shopxo-2.3.1.zip -d /opt/
[root@ubuntu2004 ~]#mv /opt/shopxo-2.3.1/* /var/www/html/
[root@ubuntu2004 ~]#chown -R www-data.www-data /var/www/html/
[root@ubuntu2004 ~]#rm -f /var/www/html/index.html

#如果出错,v2.2.0及以上版本可以修改下面文件打开调试功能再观察错误
[root@ubuntu2004 ~]#mv /var/www/html/example.env /var/www/html/.env

范例: Rocky 实现

#shopxo-2.2.3版本以前支持php7.2,直接利用系统仓库安装下面包即可
[root@rocky8 ~]#yum -y install httpd php php-mysqlnd php-json php-gd php-xml
php-pecl-zip
#shopxo-2.2.7以上版本要求必须是php7.4以上,所以rocky8.5自身的Php7.2不支持,可以选择安装remi
提供的更高版本的php
[root@rocky8 ~]#yum -y install https://mirrors.aliyun.com/remi/enterprise/remirelease-8.rpm
[root@rocky8 ~]#yum -y install httpd php74-php php74-php-mysqlnd php74-php-gd
php74-php-pecl-zip
#以上因为有依赖会自动安装php74-php-json和php74-php-xml包
[root@rocky8 ~]#systemctl enable --now httpd
[root@rocky8 ~]#wget
https://gitee.com/zongzhige/shopxo/repository/archive/v2.2.7.zip
[root@rocky8 ~]#unzip v2.2.7.zip
[root@rocky8 ~]#mv shopxo-v2.2.7/* /var/www/html/
[root@rocky8 ~]#chown -R apache.apache /var/www/html
[root@rocky8 ~]#yum -y install mysql-server
[root@rocky8 ~]#systemctl enable --now mysqld
mysql> create database shopxo;
mysql> create user shopxo@localhost identified by '123456';
mysql> grant all on shopxo.* to shopxo@localhost;

打开浏览器进行初始化

如果出错可以查看php日志

#系统仓库安装查看以下日志
[root@rocky8 ~]#cat /var/log/php-fpm/www-error.log
#remi仓库安装查看以下日志
[root@rocky8 ~]#cat /var/opt/remi/php74/log/php-fpm/www-error.log

初始化完成后,安全考虑执行下面操作

[root@rocky8 ~]#rm -rf /var/www/html/app/install/
opcache 加速
#使用内置源,默认安装即开启opache功能,无需修改配置
[root@rocky8 ~]#yum -y install php-opcache
#使用remi源
[root@rocky8 ~]#vim /etc/opt/remi/php74/php.d/10-opcache.ini
opcache.enable=0 默认开启opache加速,修改为0表示关闭,测试性能变化
[root@rocky8 ~]#systemctl restart php74-php-fpm.service

今天的分享就到这里,谢谢各位观看!