返回列表 发帖

CentOS8使用Python3脚本管理MariaDB

笺注:这是在 CentOS8编译安装Zabbix4.4.5 的基础上进行的。


查看操作系统的信息:
[root@centos8 ~]# cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)
[root@centos8 ~]#
[root@centos8 ~]# uname -r
4.18.0-193.el8.x86_64
[root@centos8 ~]#

服务器的IP地址:
[root@centos8 ~]# ifconfig |grep -A1 ens160 |tail -1 |awk '{print $2}'
192.168.168.154
[root@centos8 ~]#


查看MariaDB的版本:
[root@centos8 ~]# mysql -V
mysql  Ver 15.1 Distrib 10.3.17-MariaDB, for Linux (x86_64) using readline 5.1
[root@centos8 ~]#


查看Python3的版本:
[root@centos8 ~]# python3 --version
Python 3.6.8
[root@centos8 ~]#

查看第三方库PyMySQL的版本:
[root@centos8 ~]# pip3 freeze
PyMySQL==0.10.1
[root@centos8 ~]#





使用数据库管理员root@localhost本地登录:
mysql -u"root" -h"localhost"
图片1.png
2022-6-8 09:44

注释:
实验中,没有给数据库管理员root@localhost设置密码
-h"localhost" 是可以省略的。


创建库data1,并指定其字符集为 utf8mb4_unicode_ci 
MariaDB [(none)]> create database data1 character set utf8mb4 collate utf8mb4_unicode_ci;
Query OK, 1 row affected (0.102 sec)

MariaDB [(none)]>


查看库data1的字符集:
MariaDB [(none)]> show create database data1;
+----------+----------------------------------------------------------------------------------------------+
| Database | Create Database                                                                              |
+----------+----------------------------------------------------------------------------------------------+
| data1    | CREATE DATABASE `data1` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ |
+----------+----------------------------------------------------------------------------------------------+
1 row in set (0.001 sec)

MariaDB [(none)]>



查看库zabbix的字符集:( 库zabbix的字符集为 utf8_general_ci )
MariaDB [(none)]> show create database zabbix;
+----------+-----------------------------------------------------------------+
| Database | Create Database                                                 |
+----------+-----------------------------------------------------------------+
| zabbix   | CREATE DATABASE `zabbix` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-----------------------------------------------------------------+
1 row in set (0.000 sec)

MariaDB [(none)]>



创建本地数据库用户zhuohua@localhost(密码P@ssw8rd),只能在服务器本地进行访问,对库data1有完全控制的权限:
MariaDB [(none)]> grant all on data1.* to zhuohua@localhost identified by 'P@ssw8rd';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]>


查看本地数据库用户zhuohua@localhost的权限:
MariaDB [(none)]> show grants for zhuohua@localhost;
+-------------------------------------------------------------------------------------------------------------------------+
| Grants for zhuohua@localhost                                                                                            |
+-------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'zhuohua'@'localhost' IDENTIFIED BY PASSWORD '*CB958D742F8B3434BFEB3D30ACD6EF4B90B29E35' |
| GRANT ALL PRIVILEGES ON `data1`.* TO 'zhuohua'@'localhost'                                                              |
+-------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)

MariaDB [(none)]>


再赋权本地数据库用户zhuohua@localhost,对库zabbix有完全控制的权限:
MariaDB [(none)]> grant all on zabbix.* to zhuohua@localhost;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]>


再查看本地数据库用户zhuohua@localhost的权限:
MariaDB [(none)]> show grants for zhuohua@localhost;
+-------------------------------------------------------------------------------------------------------------------------+
| Grants for zhuohua@localhost                                                                                            |
+-------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'zhuohua'@'localhost' IDENTIFIED BY PASSWORD '*CB958D742F8B3434BFEB3D30ACD6EF4B90B29E35' |
| GRANT ALL PRIVILEGES ON `data1`.* TO 'zhuohua'@'localhost'                                                              |
| GRANT ALL PRIVILEGES ON `zabbix`.* TO 'zhuohua'@'localhost'                                                             |
+-------------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.000 sec)

MariaDB [(none)]>





######

例子一:
服务器本地测试与数据库的连接的脚本:(/root/xx.py)
[root@centos8 ~]# cat xx.py
#coding=utf-8
import pymysql

def db_connect():
        db = pymysql.connect("localhost", "zhuohua", "P@ssw8rd", "zabbix",3306,charset="utf8") #服务器本地连接数据库、用户名(使用本地数据库用户zhuohua@localhost)、用户密码、其中一个库的名称(zabbix)、端口号、字符集
        cursor = db.cursor()
       
        Sql_1 = "SELECT VERSION();" #SQL语句,查看MariaDB的版本信息
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchone() #使用fetchone只能获取一个元素

        print(Result_1)
        print(type(Result_1))
      
        print("-" * 10)
        print(Result_1[0]) #输出元组的第一个元素
        print(type(Result_1[0]))
      
        print("-" * 10)
        print(f"数据库的版本信息:{Result_1[0]}")
        db.close() #关闭数据库连接

def func_main():
        try:
                db_connect()
        except Exception as e:
                print(f"数据库连接失败,原因: {e}")
               
if __name__ == "__main__":

        func_main()


脚本运行的结果:
[root@centos8 ~]# python3 xx.py
('10.3.17-MariaDB',)
<class 'tuple'>
----------
10.3.17-MariaDB
<class 'str'>
----------
数据库的版本信息:10.3.17-MariaDB
[root@centos8 ~]#





######

例子二:
服务器本地查看MariaDB的最大连接数的脚本:
[root@centos8 ~]# cat xx.py
#coding=utf-8
import pymysql

def db_connect():
        db = pymysql.connect("localhost", "zhuohua", "P@ssw8rd", "zabbix",3306,charset="utf8")
        cursor=db.cursor()
       
        Sql_1 = "show variables like '%max_connections%';" #SQL语句,查看MariaDB的最大连接数
        cursor.execute(Sql_1)
        Result_1 = cursor.fetchall() #使用fetchall可以获取多个元素
       
        print(Result_1)
        print(type(Result_1))
        print(Result_1[1]) #输出元组的第二个元素
        print(type(Result_1[1]))
       
        print("-" * 10)
        print(Result_1[1][1])
        print(type(Result_1[1][1]))
       
        Result_2 = int(Result_1[1][1]) #字符串转换为整数
        print(Result_2)
        print(type(Result_2))
        print(f"MariaDB的最大连接数:{Result_2}")
       
        db.close()

def func_main():
        try:
                db_connect()
        except Exception as e:
                print(e)
               
if __name__ == "__main__":

        func_main()


脚本运行的结果:
[root@centos8 ~]# python3 xx.py
(('extra_max_connections', '1'), ('max_connections', '151'))
<class 'tuple'>
('max_connections', '151')
<class 'tuple'>
----------
151
<class 'str'>
151
<class 'int'>
MariaDB的最大连接数:151
[root@centos8 ~]#





######

例子三:
服务器本地查看MariaDB当前打开的连接数的脚本:
[root@centos8 ~]# cat xx.py
#coding=utf-8
import pymysql

def db_connect():
        db = pymysql.connect("localhost", "zhuohua", "P@ssw8rd", "data1",3306,charset="utf8")
        cursor=db.cursor()
       
        Sql_1 = "show status like 'threads_connected';" #SQL语句,查看MariaDB当前打开的连接数
        cursor.execute(Sql_1)
        Result_1 = cursor.fetchall()
       
        print(Result_1)
        print(type(Result_1))
        print(Result_1[0])
        print(type(Result_1[0]))
       
        print("-" * 10)
        print(Result_1[0][1])
        print(type(Result_1[0][1]))
       
        Result_2 = int(Result_1[0][1]) #字符串转换为整数
        print(Result_2)
        print(type(Result_2))
        print(f"MariaDB当前打开的连接数:{Result_2}")
       
        db.close()

def func_main():
        try:
                db_connect()
        except Exception as e:
                print(e)
               
if __name__ == "__main__":

        func_main()


脚本运行的结果:
[root@centos8 ~]# python3 xx.py
(('Threads_connected', '27'),)
<class 'tuple'>
('Threads_connected', '27')
<class 'tuple'>
----------
27
<class 'str'>
27
<class 'int'>
MariaDB当前打开的连接数:27
[root@centos8 ~]#





######

例子四:
服务器本地查看MariaDB当前处于激活状态的连接数的脚本:
[root@centos8 ~]# cat xx.py
#coding=utf-8
import pymysql

def db_connect():
        db = pymysql.connect("localhost", "zhuohua", "P@ssw8rd", "data1",3306,charset="utf8")
        cursor=db.cursor()
       
        Sql_1 = "show status like 'threads_running';" #SQL语句,查看MariaDB当前处于激活状态的连接数
        cursor.execute(Sql_1)
        Result_1 = cursor.fetchall()
       
        print(Result_1)
        print(type(Result_1))
        print(Result_1[0])
        print(type(Result_1[0]))
       
        print("-" * 10)
        print(Result_1[0][1])
        print(type(Result_1[0][1]))
       
        Result_2 = int(Result_1[0][1]) #字符串转换为整数
        print(Result_2)
        print(type(Result_2))
        print(f"MariaDB当前处于激活状态的连接数:{Result_2}")
       
        db.close()

def func_main():
        try:
                db_connect()
        except Exception as e:
                print(e)
               
if __name__ == "__main__":

        func_main()


脚本运行的结果:
[root@centos8 ~]# python3 xx.py
(('Threads_running', '1'),)
<class 'tuple'>
('Threads_running', '1')
<class 'tuple'>
----------
1
<class 'str'>
1
<class 'int'>
MariaDB当前处于激活状态的连接数:1
[root@centos8 ~]#





######

例子五:
服务器本地查看MariaDB的最大可打开表数的脚本:(能同时打开的表的总数量)
[root@centos8 ~]# cat xx.py
#coding=utf-8
import pymysql

def db_connect():
        db = pymysql.connect("localhost", "zhuohua", "P@ssw8rd", "mysql",3306,charset="utf8") #库mysql是默认就存在的
        cursor=db.cursor()
       
        Sql_1 = "show variables like 'table_open%';" #SQL语句,查看MariaDB的最大可打开表数
        cursor.execute(Sql_1)
        Result_1 = cursor.fetchall()
       
        print(Result_1)
        print(type(Result_1))
        print(Result_1[0])
        print(type(Result_1[0]))
       
        print("-" * 10)
        print(Result_1[0][1])
        print(type(Result_1[0][1]))
       
        Result_2 = int(Result_1[0][1]) #字符串转换为整数
        print(Result_2)
        print(type(Result_2))
        print(f"MariaDB的最大可打开表数:{Result_2}")
       
        db.close()

def func_main():
        try:
                db_connect()
        except Exception as e:
                print(e)
               
if __name__ == "__main__":

        func_main()


脚本运行的结果:
[root@centos8 ~]# python3 xx.py
(('table_open_cache', '2000'), ('table_open_cache_instances', '8'))
<class 'tuple'>
('table_open_cache', '2000')
<class 'tuple'>
----------
2000
<class 'str'>
2000
<class 'int'>
MariaDB的最大可打开表数:2000
[root@centos8 ~]#





######

例子六:
服务器本地查看MariaDB当前打开的表的数量的脚本:
[root@centos8 ~]# cat xx.py
#coding=utf-8
import pymysql

def db_connect():
        db = pymysql.connect("localhost", "zhuohua", "P@ssw8rd", "mysql",3306,charset="utf8")
        cursor=db.cursor()
       
        Sql_1 = "show status like 'open_table%';" #SQL语句,查看MariaDB当前打开的表的数量
        cursor.execute(Sql_1)
        Result_1 = cursor.fetchall()
       
        print(Result_1)
        print(type(Result_1))
        print(Result_1[1])
        print(type(Result_1[1]))
       
        print("-" * 10)
        print(Result_1[1][1])
        print(type(Result_1[1][1]))
       
        Result_2 = int(Result_1[1][1]) #字符串转换为整数
        print(Result_2)
        print(type(Result_2))
        print(f"MariaDB当前打开的表的数量:{Result_2}")
       
        db.close()

def func_main():
        try:
                db_connect()
        except Exception as e:
                print(e)
               
if __name__ == "__main__":

        func_main()


脚本运行的结果:
[root@centos8 ~]# python3 xx.py
(('Open_table_definitions', '170'), ('Open_tables', '171'))
<class 'tuple'>
('Open_tables', '171')
<class 'tuple'>
----------
171
<class 'str'>
171
<class 'int'>
MariaDB当前打开的表的数量:171
[root@centos8 ~]#





######

例子七:
服务器本地查看MariaDB的最大可打开文件数的脚本:
[root@centos8 ~]# cat xx.py
#coding=utf-8
import pymysql

def db_connect():
        db = pymysql.connect("localhost", "zhuohua", "P@ssw8rd", "zabbix",3306,charset="utf8")
        cursor=db.cursor()
       
        Sql_1 = "show global variables like '%open_files_limit%';" #SQL语句,查看MariaDB的最大可打开文件数
        cursor.execute(Sql_1)
        Result_1 = cursor.fetchall()
       
        print(Result_1)
        print(type(Result_1))
        print(Result_1[0])
        print(type(Result_1[0]))
       
        print("-" * 10)
        print(Result_1[0][1])
        print(type(Result_1[0][1]))
       
        Result_2 = int(Result_1[0][1]) #字符串转换为整数
        print(Result_2)
        print(type(Result_2))
        print(f"MariaDB的最大可打开文件数:{Result_2}")
       
        db.close()

def func_main():
        try:
                db_connect()
        except Exception as e:
                print(e)
               
if __name__ == "__main__":

        func_main()


脚本运行的结果:
[root@centos8 ~]# python3 xx.py
(('open_files_limit', '4183'),)
<class 'tuple'>
('open_files_limit', '4183')
<class 'tuple'>
----------
4183
<class 'str'>
4183
<class 'int'>
MariaDB的最大可打开文件数:4183
[root@centos8 ~]#





######

例子八:
服务器本地创建表的脚本:
[root@centos8 ~]# cat xx.py
#coding=utf-8
import pymysql

def create_table():

        db = pymysql.connect("localhost", "zhuohua", "P@ssw8rd", "data1",3306,charset="utf8")       
        cursor = db.cursor()
       
        #创建表table1,字段id会自动增长;这是在库data1中创建表
        Sql_1 = """CREATE TABLE table1 (
                id int not null auto_increment,
                name varchar(20) NOT NULL,
                math decimal(50,2),
                address text,shijian datetime,
                primary key(id)
                )""" #SQL语句
       
        cursor.execute(Sql_1) #执行SQL语句       
        db.close()
               
def func_main():
        try:
                create_table()
        except Exception as e:
                print(f"创建表table1失败,原因: {e}")
        else:
                print("创建表table1成功。")
               
if __name__ == "__main__":

        func_main()


脚本运行的结果:
[root@centos8 ~]# python3 xx.py
创建表table1成功。
[root@centos8 ~]#


在MariaDB服务器本地查看库data1中的表table1的表结构:
[root@centos8 ~]# mysql -u"zhuohua" -p"P@ssw8rd" -e "use data1;desc table1;"
图片2.png
2022-6-8 09:53






######

例子九:
服务器本地一次性插入多条记录的脚本:
[root@centos8 ~]# cat xx.py
#coding=utf-8
import pymysql

import datetime
dt = datetime.datetime.now()
tt_1 = dt.strftime('%Y-%m-%d %H:%M:%S') #当前具体时间

def insert_record():
        global db
        db = pymysql.connect("localhost", "zhuohua", "P@ssw8rd", "data1",3306,charset="utf8")
        cursor = db.cursor()
       
        Sql_1 = "INSERT INTO table1(name,math,address,shijian)" \
        " VALUES('李大杰',18,'广东省,guangzhou','2019-9-9 7:9:18')"        
        cursor.execute(Sql_1)
       
        Key_1 = '范小冰'
        Key_2 = 28
        Key_3 = '四川省,hangzhou'
        Key_4 = '2019-10-08 05:06:08'
       
        Sql_2 = f"INSERT INTO table1(name,math,address,shijian) VALUES('{Key_1}',{Key_2},'{Key_3}','{Key_4}')"
        cursor.execute(Sql_2)

        Key_1 = 'Zhuohua'
        Key_2 = 38.5
        Key_3 = '湖北省,jingzhou'
        Key_4 = tt_1
       
        Sql_3 = f"INSERT INTO table1(name,math,address,shijian) VALUES('{Key_1}',{Key_2},'{Key_3}','{Key_4}')"
        cursor.execute(Sql_3)
               
        db.commit() #把执行任务提交到数据库;必须是所有SQL语句都执行成功才会提交
        db.close()
               
def func_main():
        try:
                insert_record()
        except Exception as e:
                print(f"插入记录失败,原因: {e}")
                db.rollback() #如果发生错误就回滚
        else:
                print("插入记录成功。")
               
if __name__ == "__main__":

        func_main()


脚本运行的结果:
[root@centos8 ~]# python3 xx.py
插入记录成功。
[root@centos8 ~]#


在MariaDB服务器本地查看库data1中的表table1的表数据:
[root@centos8 ~]# mysql -u"zhuohua" -p"P@ssw8rd" -e "use data1;select * from table1;"
图片3.png
2022-6-8 09:53






######

例子十:
服务器本地输出数据库中某个表的所有记录的脚本:
[root@centos8 ~]# cat xx.py
#coding=utf-8
import pymysql

def query_data():
        db = pymysql.connect("localhost", "zhuohua", "P@ssw8rd", "data1",3306,charset="utf8")
        cursor = db.cursor()
               
        Sql_1 = "select * from table1;" #库data1中的表table1
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchall()
        print(Result_1)
        print(type(Result_1))
       
        print("-" * 10)
       
        for Key_1 in Result_1: #自定义输出格式
                id = Key_1[0]
                name = Key_1[1]
                math = Key_1[2]
               
                address = Key_1[3]
                shijian = str(Key_1[4])

                print(f"id={id}<<,>>姓名={name}<<,>>数学成绩={math}<<,>>地址={address}<<,>>时间={shijian}")
                       
        db.commit() #把执行任务提交到数据库
        db.close()

def func_main():
        try:
                query_data()
        except Exception as e:
                print(f"输出失败,原因: {e}")

if __name__ == "__main__":

        func_main()


脚本运行的结果:
[root@centos8 ~]# python3 xx.py
((1, '李大杰', Decimal('18.00'), '广东省,guangzhou', datetime.datetime(2019, 9, 9, 7, 9, 18)), (2, '范小冰', Decimal('28.00'), '四川省,hangzhou', datetime.datetime(2019, 10, 8, 5, 6, 8)), (3, 'Zhuohua', Decimal('38.50'), '湖北省,jingzhou', datetime.datetime(2022, 6, 7, 17, 9, 57)))
<class 'tuple'>
----------
id=1<<,>>姓名=李大杰<<,>>数学成绩=18.00<<,>>地址=广东省,guangzhou<<,>>时间=2019-09-09 07:09:18
id=2<<,>>姓名=范小冰<<,>>数学成绩=28.00<<,>>地址=四川省,hangzhou<<,>>时间=2019-10-08 05:06:08
id=3<<,>>姓名=Zhuohua<<,>>数学成绩=38.50<<,>>地址=湖北省,jingzhou<<,>>时间=2022-06-07 17:09:57
[root@centos8 ~]#





######

例子十一:
服务器本地保存(覆盖)数据库中某个表里所有的记录到文件的脚本:
[root@centos8 ~]# cat xx.py
#coding=utf-8
import pymysql

def query_data():
        db = pymysql.connect("localhost", "zhuohua", "P@ssw8rd", "data1",3306,charset="utf8")
        cursor = db.cursor()
       
        Sql_1 = "select * from table1;" #库data1中的表table1
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchall()
       
        for Key_1 in Result_1: #自定义输出格式
                id = Key_1[0]
                name = Key_1[1]
                math = Key_1[2]
               
                address = Key_1[3]
                shijian = str(Key_1[4])

                print(f"id={id}<<,>>姓名={name}<<,>>数学成绩={math}<<,>>地址={address}<<,>>时间={shijian}")
               
        db.commit() #把执行任务提交到数据库
        db.close()

def func_main():
        try:
                query_data()
        except Exception as e:
                print(f"输出失败,原因: {e}")

if __name__ == "__main__":

        func_main()


脚本运行的结果:(文件1.txt不存在的话,会自动创建)
[root@centos8 ~]# python3 xx.py > 1.txt
[root@centos8 ~]#
[root@centos8 ~]# cat 1.txt
id=1<<,>>姓名=李大杰<<,>>数学成绩=18.00<<,>>地址=广东省,guangzhou<<,>>时间=2019-09-09 07:09:18
id=2<<,>>姓名=范小冰<<,>>数学成绩=28.00<<,>>地址=四川省,hangzhou<<,>>时间=2019-10-08 05:06:08
id=3<<,>>姓名=Zhuohua<<,>>数学成绩=38.50<<,>>地址=湖北省,jingzhou<<,>>时间=2022-06-07 17:09:57

[root@centos8 ~]#





######

例子十二:
服务器本地清空某个库中的某个表的脚本:
[root@centos8 ~]# cat xx.py
#coding=utf-8
import pymysql

def truncate_table():

        db = pymysql.connect("localhost", "zhuohua", "P@ssw8rd", "data1",3306,charset="utf8")
        cursor = db.cursor()
  
        Sql_1 = "truncate table table1;" #清空库data1中的表table1
        cursor.execute(Sql_1)

        db.commit() #把执行任务提交到数据库
        db.close()

        print ("清空表table1成功。")

def func_main():
        try:
                truncate_table()
        except Exception as e:
                print(f"清空表失败,原因: {e}")

if __name__ == "__main__":

        func_main()


脚本运行的结果:
[root@centos8 ~]# python3 xx.py
清空表table1成功。
[root@centos8 ~]#


在MariaDB服务器本地查看库data1中的表table1的表数据:(表table1的数据已被清空)
[root@centos8 ~]# mysql -u"root" -e "select * from data1.table1;"
[root@centos8 ~]#





######

例子十三:
服务器把本地文件里的所有记录添加到数据库中的某个表的脚本:
[root@centos8 ~]# cat xx.py
#coding=utf-8
import pymysql

def func1():
        Path_1 = "./1.txt"
        f_name = open(Path_1,'r')
        Result_1 = f_name.readlines() #输出结果为列表,包含换行符
        f_name.close()
       
        print(Result_1)
        print(type(Result_1))
       
        insert_record(Result_1)  

       
def insert_record(Result_1):
        db = pymysql.connect("localhost", "zhuohua", "P@ssw8rd", "data1",3306,charset="utf8")
        cursor = db.cursor()

        for Key_1 in Result_1:
                #字段id为主键、标识符列,会自动增长,不用写
                name = Key_1.split('<<,>>')[1][3:] #去掉前面3个字符
                math = float(Key_1.split('<<,>>')[2][5:]) #去掉前面5个字符,再转换为浮点数
               
                address = Key_1.split('<<,>>')[3][3:]
                shijian = Key_1.split('<<,>>')[4][3:].rstrip('\n') #去掉前面3个字符,再去除右边的换行符
               
                Sql_1 = f"INSERT INTO table1(name,math,address,shijian) VALUES('{name}',{math},'{address}','{shijian}')"
                cursor.execute(Sql_1)
               
        db.commit() #把执行任务提交到数据库
        db.close()
               
               
if __name__ == "__main__":

        func1()


脚本运行的结果:
[root@centos8 ~]# python3 xx.py
['id=1<<,>>姓名=李大杰<<,>>数学成绩=18.00<<,>>地址=广东省,guangzhou<<,>>时间=2019-09-09 07:09:18\n', 'id=2<<,>>姓名=范小冰<<,>>数学成绩=28.00<<,>>地址=四川省,hangzhou<<,>>时间=2019-10-08 05:06:08\n', 'id=3<<,>>姓名=Zhuohua<<,>>数学成绩=38.50<<,>>地址=湖北省,jingzhou<<,>>时间=2022-06-07 17:09:57\n']
<class 'list'>
[root@centos8 ~]#


在MariaDB服务器本地查看库data1中的表table1的表数据:(表table1的数据已恢复)
[root@centos8 ~]# mysql -u"root" -e "select * from data1.table1;"
图片4.png
2022-6-8 09:57













######
######

在服务器本地,使用数据库管理员root@localhost,
创建远程数据库用户zhuohua@'192.168.168.130'(密码P@ssw9rd),仅仅在使用IP地址192.168.168.130时可以进行访问,对库data1、zabbix有完全控制的权限:
[root@centos8 ~]# mysql -u"root" -e "grant all on data1.* to zhuohua@'192.168.168.130' identified by 'P@ssw9rd';"
[root@centos8 ~]#

[root@centos8 ~]# mysql -u"root" -e "grant all on zabbix.* to zhuohua@'192.168.168.130';"
[root@centos8 ~]#


查看远程数据库用户zhuohua@'192.168.168.130'的权限:
[root@centos8 ~]# mysql -u"root" -e "show grants for zhuohua@'192.168.168.130';"
+----------------------------------------------------------------------------------------------------------------------+
| Grants for zhuohua@192.168.168.130                                                                                   |
+----------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'zhuohua'@'192.168.168.130' IDENTIFIED BY PASSWORD '*F88885C407076DA20E20E6092C49874F63A90EEC' |
| GRANT ALL PRIVILEGES ON `data1`.* TO 'zhuohua'@'192.168.168.130'                                                     |
| GRANT ALL PRIVILEGES ON `zabbix`.* TO 'zhuohua'@'192.168.168.130'                                                    |
+----------------------------------------------------------------------------------------------------------------------+
[root@centos8 ~]#



服务器要在防火墙(Firewalld)打开TCP 3306 端口:
[root@centos8 ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
success
[root@centos8 ~]# firewall-cmd --reload
success
[root@centos8 ~]#


查看防火墙(Firewalld)所有打开的端口:
[root@centos8 ~]# firewall-cmd --zone=public --list-ports
80/tcp 3306/tcp
[root@centos8 ~]#





######

例子十四:
Linux客户端远程测试与数据库的连接的脚本:(/yy.py)
[root@centos6 ~]# cat /yy.py
#coding=utf-8
import pymysql

def db_connect():
        db = pymysql.connect("192.168.168.154", "zhuohua", "P@ssw9rd", "data1",3306,charset="utf8") #连接数据库;MariaDB服务器的IP地址(192.168.168.154)、用户名(使用远程数据库用户zhuohua@'192.168.168.130')、用户密码、其中一个库的名称(data1)、端口号、字符集
        cursor = db.cursor()
       
        Sql_1 = "select version();" #SQL语句,查看MariaDB的版本信息
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchone()

        print(f"数据库的版本信息:{Result_1[0]}")
        db.close() #关闭数据库连接

def func_main():
        try:
                db_connect()
        except Exception as e:
                print(f"数据库连接失败,原因: {e}")
        else:
                print("数据库连接成功。")
               
if __name__ == "__main__":

        func_main()


脚本运行的结果:
[root@centos6 ~]# python3 /yy.py
数据库的版本信息:10.3.17-MariaDB
数据库连接成功。

[root@centos6 ~]#





######

例子十五:
Linux客户端远程输出数据库中某个表的所有记录的脚本:
[root@centos6 ~]# cat /yy.py
#coding=utf-8
import pymysql

def query_data():
        db = pymysql.connect("192.168.168.154", "zhuohua", "P@ssw9rd", "data1",3306,charset="utf8")
        cursor = db.cursor()
               
        Sql_1 = "select * from table1;" #库data1中的表table1
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchall()
       
        for Key_1 in Result_1: #自定义输出格式
                id = Key_1[0]
                name = Key_1[1]
                math = Key_1[2]
               
                address = Key_1[3]
                shijian = str(Key_1[4])

                print(f"id={id}<<,>>姓名={name}<<,>>数学成绩={math}<<,>>地址={address}<<,>>时间={shijian}")
                       
        db.commit() #把执行任务提交到数据库
        db.close()

def func_main():
        try:
                query_data()
        except Exception as e:
                print(f"输出失败,原因: {e}")

if __name__ == "__main__":

        func_main()


脚本运行的结果:
[root@centos6 ~]# python3 /yy.py
id=1<<,>>姓名=李大杰<<,>>数学成绩=18.00<<,>>地址=广东省,guangzhou<<,>>时间=2019-09-09 07:09:18
id=2<<,>>姓名=范小冰<<,>>数学成绩=28.00<<,>>地址=四川省,hangzhou<<,>>时间=2019-10-08 05:06:08
id=3<<,>>姓名=Zhuohua<<,>>数学成绩=38.50<<,>>地址=湖北省,jingzhou<<,>>时间=2022-06-07 17:09:57

[root@centos6 ~]#





######

例子十六:
Linux客户端远程输出数据库中某个表里符合指定条件的记录的脚本:
[root@centos6 ~]# cat /yy.py
#coding=utf-8
import pymysql

def query_data():
        db = pymysql.connect("192.168.168.154", "zhuohua", "P@ssw9rd", "data1",3306,charset="utf8")
        cursor = db.cursor()
               
        Key_1 = '广%' #关键字
        Key_2 = '%jing%' #关键字
       
        Sql_1 = f"select * from table1 where address like '{Key_1}' or address like '{Key_2}'"
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchall()
       
        for Key_1 in Result_1: #自定义输出格式
                id = Key_1[0]
                name = Key_1[1]
                math = Key_1[2]
               
                address = Key_1[3]
                shijian = str(Key_1[4])
                shijian_1 = str(Key_1[4])[0:10] #输出前面10个字符
                shijian_2 = str(Key_1[4])[-8:] #输出最后8个字符

                print(f"id={id}<<,>>姓名={name}<<,>>数学成绩={math}<<,>>地址={address}<<,>>时间={shijian}<<,>>日期部分={shijian_1}<<,>>时间部分={shijian_2}")
                       
        db.commit() #把执行任务提交到数据库
        db.close()

def func_main():
        try:
                query_data()
        except Exception as e:
                print(f"输出失败,原因: {e}")

if __name__ == "__main__":

        func_main()


脚本运行的结果:(假如找到匹配的记录时)
[root@centos6 ~]# python3 /yy.py
id=1<<,>>姓名=李大杰<<,>>数学成绩=18.00<<,>>地址=广东省,guangzhou<<,>>时间=2019-09-09 07:09:18<<,>>日期部分=2019-09-09<<,>>时间部分=07:09:18
id=3<<,>>姓名=Zhuohua<<,>>数学成绩=38.50<<,>>地址=湖北省,jingzhou<<,>>时间=2022-06-07 17:09:57<<,>>日期部分=2022-06-07<<,>>时间部分=17:09:57
[root@centos6 ~]#


脚本运行的结果:(假如没有找到匹配的记录时)
[root@centos6 ~]# python3 /yy.py
[root@centos6 ~]#












######

例子十七:
服务器本地测试MariaDB是否运行中的脚本:
[root@centos8 ~]# cat zz.py
#coding=utf-8
import os

try:
        Result_1 = os.popen("ps -ef |grep mysqld |grep -v grep > /dev/null && echo $?").read()
        Result_2 = int(Result_1) #字符串转换为整数

        if Result_2 == 0:
                print('MariaDB正在运行中。')

except:
        print('MariaDB没有运行。')


脚本运行的结果:
[root@centos8 ~]# systemctl stop mysqld
[root@centos8 ~]#
[root@centos8 ~]# python3 zz.py
MariaDB没有运行。
[root@centos8 ~]#
[root@centos8 ~]# systemctl start mysqld
[root@centos8 ~]#
[root@centos8 ~]# python3 zz.py
MariaDB正在运行中。
[root@centos8 ~]#





######

例子十八:
服务器本地关闭MariaDB的脚本:
[root@centos8 ~]# cat zz.py
#coding=utf-8
import os

try:
        Result_1 = os.popen("systemctl stop mysqld > /dev/null").read()
        print('MariaDB关闭成功。')

except Exception as e:
        print(f'MariaDB关闭失败,原因{e}')


脚本运行的结果:(成功时)
[root@centos8 ~]# python3 zz.py
MariaDB关闭成功。
[root@centos8 ~]#
[root@centos8 ~]# ps -ef |grep mysqld |grep -v grep
[root@centos8 ~]#





######

例子十九:
服务器本地启动MariaDB的脚本:
[root@centos8 ~]# cat zz.py
#coding=utf-8
import os

try:
        Result_1 = os.popen("systemctl start mysqld > /dev/null").read()
        print('MariaDB启动成功。')

except Exception as e:
        print(f'MariaDB启动失败,原因{e}')


脚本运行的结果:(成功时)
[root@centos8 ~]# python3 zz.py
MariaDB启动成功。
[root@centos8 ~]#
[root@centos8 ~]# ps -ef |grep mysqld |grep -v grep
mysql      41380       1 10 20:36 ?        00:00:00 /usr/libexec/mysqld --basedir=/usr
[root@centos8 ~]#





相关文章:
CentOS8使用Python3脚本管理MySQL8.0
CentOS8安装LAMP+phpMyAdmin
MariaDB的最大连接数/最大可打开表数/最大可打开文件数

MySQL的字符集
字符串的截取

返回列表