Python高级 -- 09 MySQL高级之事务、视图、索引、账户管理、主从配置

一、视图


1、视图是什么

        通俗的讲,视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。


        视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变);


        视图方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性;


2、定义视图


将查询的结果放入视图中,建议视图名称以 v_ 开头


create view 视图名称 as select 语句;


3、查看视图


查看所有表的操作会将视图也列出来


show tables;


4、使用视图


使用视图就是查询操作


select * from v_stu_score;


5、删除视图


drop view 视图名称;


6、视图的作用


        (1)、提高了重用性,就像一个函数


        (2)、对数据库重构,却不影响程序的运行


        (3)、提高了安全性能,可以对不同的用户


        (4)、让数据更加清晰


二、事务


1、事务的四大特性(ACID)


start transaction;

select balance from checking where customer_id = 10233276;

update checking set balance = balance - 200.00 where customer_id = 10233276;

update savings set balance = balance + 200.00 where customer_id = 10233276;

commit;


(1)、原子性(atomicity)


        一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。


(2)、一致性(consistency)


        数据库总是从一个一致性的状态转换到另一个一致性的状态。(在前面的例子中,一致性确保了,即使在执行第三、四条语句之间时系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。)


(3)、隔离性(isolation)


        通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。(在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另外的一个账户汇总程序开始运行,则其看到支票帐户的余额并没有被减去200美元。)


(4)、久性(durability)


        一旦事务提交,则其所做的修改会永久保存到数据库。(此时即使系统崩溃,修改的数据也不会丢失。)


2、事务命令


表的引擎类型必须是innodb类型才可以使用事务,这是mysql表的默认引擎,查看表的创建语句,可以看到engine=innodb


(1)、开启事务


begin;
或者
start transaction;


(2)、提交事务


commit;


(3)、回滚事务


rollback;


三、索引


1、什么是索引


        索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。


        更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度


2、索引的目的


        索引的目的在于提高查询效率,


3、索引的使用


(1)、查看索引


show index from 表名;


(2)、创建索引


        如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致


        字段类型如果不是字符串,可以不填写长度部分


create index 索引名称 on 表名(字段名称(长度))


(3)、删除索引


drop index 索引名称 on 表名;


4、索引使用前后对比的案例


(1)、创建测试表,并向其中插入十万条数据


create table test_index(title varchar(10));


from pymysql import connect

def main():
    # 创建Connection连接
    conn = connect(host='localhost',port=3306,database='jing_dong',user='root',password='mysql',charset='utf8')
    # 获得Cursor对象
    cursor = conn.cursor()
    # 插入10万次数据
    for i in range(100000):
        cursor.execute("insert into test_index values('ha-%d')" % i)
    # 提交数据
    conn.commit()

if __name__ == "__main__":
    main()


(2)、查询


开启运行时间监测


set profiling=1;


查找第1万调数据


select * from test_index where title='ha-99999';


查看运行SQL的时间


show profiles;




为表test_index的titile列创建索引


create index title_index on test_index(title(10));


执行查询语句


select * from test_index where title='ha-99999';


再次查看执行时间




5、创建索引注意事项


        要注意的是,建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。


        建立索引会占用磁盘空间


四、账户管理


1、为什么要进行账户管理


        在生产环境下操作数据库时,绝对不可以使用root账户连接,而是创建特定的账户,授予这个账户特定的操作权限,然后连接进行操作,主要的操作就是数据的crud。账户的操作主要包括创建账户删除账户修改密码授权权限等。


2、MySQL账户体系


根据账户所具有的权限的不同,MySQL的账户可以分为以下几种:


        服务实例级账号:启动了一个mysqld,即为一个数据库实例;如果某用户如root,拥有服务实例级分配的权限,那么该账号就可以删除所有的数据库、连同这些库中的表


        数据库级别账号:对特定数据库执行增删改查的所有操作


        数据表级别账号:对特定表执行增删改查等所有操作


        字段级别的权限:对某些表的特定字段进行操作


        存储程序级别的账号:对存储程序进行增删改查的操作


3、注意


        进行账户操作时,需要使用root账户登录,这个账户拥有最高的实例级权限。


        通常都使用数据库级操作权限


4、查看所有用户


所有用户及权限信息存储在mysql数据库的user表中


desc user;

主要字段说明:


        Host 表示允许访问的主机


        User 表示用户名


        authentication_string 表示密码,为加密后的值




5、创建账户、授权


        创建账户及授权需要使用root账户(超级管理员)进行操作


        常用权限主要包括:create、alter、drop、insert、update、delete、select


        如果分配所有权限,可以使用 all privileges


(1)、创建账户及授权语法


grant 权限列表 on 数据库 to '用户名'@'访问主机' identified by '密码';


说明:


        可以操作python数据库的所有表,方式为:python.* ;如果是具体的表,方式为:python.表名


        访问主机通常使用 百分号 表示此账户可以使用任何 ip 的主机登录访问此数据库⭐⭐⭐


        访问主机可以设置成 localhost或具体的ip,表示只允许本机或特定主机访问


(2)、查看用户有哪些权限


show grants for 用户名@访问主机;


(3)、示例:




5、修改(添加)权限


(1)、修改权限语法


grant 权限名称 on 数据库 to 账户@主机 with grant option;


(2)、示例:




6、修改密码


注意:修改密码需要使用 root 登录,修改mysql数据库的user表


(1)、使用password( ) 函数进行密码加密


update user set authentication_string=password('新密码') where user='用户名';


(2)、修改完成后需要重新刷新权限


刷新权限:flush privileges


(3)、示例




7、远程登录mysql


        如果向在一个Ubuntu中使用msyql命令远程连接另外一台mysql服务器的话,通过以下方式即可完成,但是此方法仅仅了解就好了,不要在实际生产环境中使用(此方法慎用


(1)、创建用户时


        访问主机通常使用 百分号  表示此账户可以使用任何 ip 的主机登录访问此数据库


mysql> grant all privileges on jing_dong.* to 'lis'@'%' identified by 'lis';


(2)、修改ubuntu的mysql配置文件


        将ubuntu中的 /etc/mysql/mysql.conf.d/mysqld.cnf 路径下的配置文件中绑定本地ip的配置注释掉,然后重启ubuntu中的mysql服务,即可进行远程访问






(3)、如果依然链接不上,解决方案如下:


网络不通


        通过 ping xxx.xxx.xx.xxx可以发现网络是否正常


查看数据库是否配置了bind_address参数


      本地登录数据库查看my.cnf文件和数据库当前参数show variables like 'bind_address'。如果设置了bind_address=127.0.0.1 那么只能本地登录


查看数据库是否设置了skip_networking参数


        如果设置了该参数,那么只能本地登录mysql数据库


端口指定是否正确


8、删除账户


语法1:


drop user '用户名'@'主机';


语法2:


delete from user where user='用户名';


注意:操作之后需要重新刷新权限


五、MySQL主从同步配置


1、主从同步的定义


        主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。因为复制是异步进行的,所以从服务器不需要一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。


2、使用主从同步的好处:


        通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整整个数据库的性能。


        提高数据安全,因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据


        在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能


3、主从同步机制




        Mysql服务器之间的主从同步是基于二进制日志机制,主服务器使用二进制日志来记录数据库的变动情况,从服务器通过读取和执行该日志文件来保持和主服务器的数据一致。


        在使用二进制日志时,主服务器的所有操作都会被记录下来,然后从服务器会接收到该日志的一个副本。从服务器可以指定执行该日志中的哪一类事件(譬如只插入数据或者只更新数据),默认会执行日志中的所有语句。


        每一个从服务器会记录关于二进制日志的信息:文件名和已经处理过的语句,这样意味着不同的从服务器可以分别执行同一个二进制日志的不同部分,并且从服务器可以随时连接或者中断和服务器的连接。


        主服务器和每一个从服务器都必须配置一个唯一的ID号(在my.cnf文件的[mysqld]模块下有一个server-id配置项),另外,每一个从服务器还需要通过CHANGE MASTER TO语句来配置它要连接的主服务器的ip地址,日志文件名称和该日志里面的位置(这些信息存储在主服务器的数据库里)


4、配置主从同步的基本步骤


有很多种配置主从同步的方法,可以总结为如下的步骤:


        ⭐在主服务器上,必须开启二进制日志机制和配置一个独立的ID


        ⭐在每一个从服务器上,配置一个唯一的ID,创建一个用来专门复制主服务器数据的账号


        ⭐在开始复制进程前,在主服务器上记录二进制文件的位置信息


        ⭐如果在开始复制之前,数据库中已经有数据,就必须先创建一个数据快照(可以使用mysqldump导出数据库,或者直接复制数据文件)


        ⭐配置从服务器要连接的主服务器的IP地址和登陆授权,二进制日志文件名和位置


5、详细配置主从同步的方法


        主和从的身份可以自己指定,我们将虚拟机ip为(192.168.37.128)的Ubuntu中MySQL作为主服务器,将Linux虚拟机中的MySQL作为从服务器。 在主从设置前,要保证Ubuntu与Windows间的网络连通。


(1)、备份主服务器原有数据到从服务器


        如果在设置主从同步前,主服务器上已有大量数据,可以使用mysqldump进行数据备份并还原到从服务器以实现数据的复制。


/usr# mysqldump -uroot -pmysql --all-databases --lock-all-tables > /usr/local/ubuntu_db.sql


说明:


        -u :用户名


        -p :示密码


        --all-databases :导出所有数据库


        --lock-all-tables :执行操作时锁住所有表,防止操作时有数据修改


        /usr/local/ubuntu_db.sql :导出的备份数据(sql文件)位置,可自己指定




在从服务器(Linux)上进行数据还原




(2)、配置主服务器master(ubuntu中的MySQL)


编辑设置mysqld的配置文件,设置log_bin和service_id


root@ubuntu:/usr# sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf




重启主服务器中的MySQL


root@ubuntu:/usr# service mysql restart


登录ubuntu中的MySQL,创建用于从服务器同步数据的账户


GRANT REPLICATION SLAVE ON *.* TO '用户名'@'%' identified by '密码';

FLUSH PRIVILEGES;




获取主服务器中的二进制日志信息


SHOW MASTER STATUS;


注意:从服务器的配置需要日志信息中的数据




File为使用的日志文件名字,Position为使用的文件位置,这两个参数须记下,配置从服务器时会用到


(3)、配置从服务器(Linux中的MySQL)


⭐:找到Linux中的MySQL配置文件并修改配置文件




⭐:重启MySQL服务




6、进入从服务器(Linux)的mysql,设置连接到master主服务器


change master to master_host='192.168.37.128', master_user='slave', master_password='slave',master_log_file='mysql-bin.000001', master_log_pos=590;



        master_host:主服务器Ubuntu的ip地址


        master_log_file: 前面查询到的主服务器日志文件名


        master_log_pos: 前面查询到的主服务器日志文件位置




7、从服务器(Linux)的MySQL中开启同步,查看同步状态


start slave;

show slave status \G;


8、测试主从同步


在主表中更新数据,查看从表中是否已经更新


猜你喜欢

转载自blog.csdn.net/wingzhezhe/article/details/79567226