• 数据库04,用户授权及备份


    一、用户授权

    1.1 什么是用户授权

      在数据库服务器上添加新的连接用户,添加用户时可以设置用户权限和连接用户密码,默认数据库管理员root用户是有授权操作的

    1.2 用户授权的命令格式

      grant 授权列表 on 库名 to 用户名@"客户端地址" identified by "密码"  //授权用户密码

      with grant option ;//有授权权限,可选项(加上这一句意味着新的用户也具有授权新用户的能力)

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

      授权列表:

      all 所有权限

      usage //无权限

      select update insert //个别权限

            select,update(字段1,字段2……) //指定字段

      库名:

      *.*   //所有库下所有表

      库名.*   //指定库下的所有表

      库名.表名    //指定库下的指定表

      用户名:

      授权时自定义,要有标识性

      存储在MySQL库的user表里

      客户端地址:

      — % //所有主机

      —192.168.4.%   //网段内的所有主机

      —192.168.4.1    //1台主机

      —localhost     //数据库服务器本机

      

    1.3授权例子

      服务机本机上进行授权:

    mysql> grant all on *.* to admin@"192.168.142.129" identified by "123qqq...A"
        -> ;
    Query OK, 0 rows affected (1.10 sec)

      客户机上进行查看:(客户机上要查看是否有mysql 命令 which mysql 查看,若没有,安装mariadb 软件包)

    [leilei@localhost ~]$ mysql -h192.168.142.140 -uadmin -p"123qqq...A"

    这时在客户机上可以看到 服务及上的数据库:

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | abc123             |
    | db3                |
    | mysql              |
    | performance_schema |
    +--------------------+
    5 rows in set (0.16 sec)

    1.4相关命令

      查找添加用户

      select user();    查看已授权的用户,显示登录用户名和客户端地址,只是查看当前主机上被授权的用户是谁,无法查询所有被授权的用户

    mysql> select user();  ###客户端上
    +-----------------------+
    | user()                |
    +-----------------------+
    | admin@192.168.142.129 |
    +-----------------------+

    mysql> select user();####数据库服务机上
    +----------------+
    | user() |
    +----------------+
    | root@localhost |
    +----------------+
    1 row in set (0.00 sec

      show grants;用户显示自身访问权限,也只是在自身登录到的数据库下查看自身拥有的权限

    mysql> show grants;#####服务机上查看
    +----------------------------------------------------------------------------------------------------------------------------------------+
    | Grants for root@localhost                                                                                                              |
    +----------------------------------------------------------------------------------------------------------------------------------------+
    | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' WITH GRANT OPTION |
    | GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION   

    mysql> show grants;######客户机上查看
    +-----------------------------------------------------------------------------------------------------------------------------+
    | Grants for admin@192.168.142.129 |
    +-----------------------------------------------------------------------------------------------------------------------------+
    | GRANT ALL PRIVILEGES ON *.* TO 'admin'@'192.168.142.129' IDENTIFIED BY PASSWORD '*F19C699342FA5C91EBCF8E0182FB71470EB2AF30' |

                                                                  |

    show grants for 用户名@"客户端地址"  管理员查看已有授权用户权限(要知道授权用户名字和客户端地址)

    mysql> show grants for admin@192.168.142.129;
    +-----------------------------------------------------------------------------------------------------------------------------+
    | Grants for admin@192.168.142.129                                                                                            |
    +-----------------------------------------------------------------------------------------------------------------------------+
    | GRANT ALL PRIVILEGES ON *.* TO 'admin'@'192.168.142.129' IDENTIFIED BY PASSWORD '*F19C699342FA5C91EBCF8E0182FB71470EB2AF30' |

    set password=password("密码");  授权用户登录后修改连接密码

    mysql> set password=password("123");
    Query OK, 0 rows affected (0.04 sec)

    set password for 用户@客户端地址 =password("密码");  管理员修改授权用户的登录密码

    mysql> set password for admin@192.168.142.129=password("123");
    Query OK, 0 rows affected (0.00 sec)

    drop user 用户名@客户端地址;  管理员权限下删除授权用户

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

    1.5授权库MySQL

      show databases;

      每一个数据库里都有一个mysql库

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | abc123             |
    | db3                |
    | mysql              |
    | performance_schema |
    +--------------------+

    在mysql库下,查看表:

      1.user  记录已有的授权用户和权限

    user表下的部分字段

    mysql> desc user;
    +------------------------+-----------------------------------+------+-----+-----------------------+-------+
    | Field                  | Type                              | Null | Key | Default               | Extra |
    +------------------------+-----------------------------------+------+-----+-----------------------+-------+
    | Host                   | char(60)                          | NO   | PRI |                       |       |
    | User                   | char(16)                          | NO   | PRI |                       |       |
    | Password               | char(41)                          | NO   |     |                       |       |
    | Select_priv            | enum('N','Y')                     | NO   |     | N                     |       |
    | Insert_priv            | enum('N','Y')                     | NO   |     | N                     |       |
    | Update_priv            | enum('N','Y')                     | NO   |     | N                     |       |
    | Delete_priv            | enum('N','Y')                     | NO   |     | N                     |       |
    | Create_priv            | enum('N','Y')                     | NO   |     | N                     |       |
    | Drop_priv              | enum('N','Y')                     | NO   |     | N                     |       |

    根据字段查看权限

    mysql> select user,host,password from user; ######可以查看到所有授权的用户
    +-------+-----------------------+-------------------------------------------+
    | user  | host                  | password                                  |
    +-------+-----------------------+-------------------------------------------+
    | root  | localhost             | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
    | root  | localhost.localdomain |                                           |
    | root  | 127.0.0.1             |                                           |
    | root  | ::1                   |                                           |
    |       | localhost             |                                           |
    |       | localhost.localdomain |                                           |
    | admin | 192.168.142.129       | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
    +-------+-----------------------+-------------------------------------------+

      2.db    记录已有授权用户对数据库的访问权限

      mysql> grant all on abc123.* to mydb@localhost identified by "123"; ####增加一条本机的用户权限

      grant all on abc123.* to admin@192.168.142.129 identified by "123";###再添加一条客户端的授权

    mysql> select user,host,db from db;#########可以看到用户admin和mydb 所在的地址及对数据库具体的权限,而上两行的%就表示对所有都有权限
    +-------+-----------------+---------+
    | user | host | db |
    +-------+-----------------+---------+
    | | % | test |
    | | % | test\_% |
    | admin | 192.168.142.129 | abc123 |
    | mydb | localhost | abc123 |
    +-------+-----------------+---------+

    看到db 表中的权限后,就可以用update来修改相关权限

    #flush priviles 可以来刷新修改权限后的数据库

      3.tables_priv  记录已有授权用户对表的访问权限(没有特殊对表的权限时,表内数据为空)

    mysql> grant update,insert on abc123.T3 to admin@192.168.142.129 identified by "123" with grant option;
    Query OK, 0 rows affected (0.04 sec)
    
    mysql> select * from tables_priv;
    +-----------------+--------+-------+------------+----------------+---------------------+---------------------+-------------+
    | Host            | Db     | User  | Table_name | Grantor        | Timestamp           | Table_priv          | Column_priv |
    +-----------------+--------+-------+------------+----------------+---------------------+---------------------+-------------+
    | 192.168.142.129 | abc123 | admin | T3         | root@localhost | 0000-00-00 00:00:00 | Insert,Update,Grant |             |
    +-----------------+--------+-------+------------+----------------+---------------------+---------------------+-------------+
    1 row in set (0.00 sec)

    解读:  客户端192.168.142.129 的admin用户对abc123下的T3表有insert,update,还有授予权限grant的权限,其中timestamp 为自定义的授权时间,columns_priv为字段权限

      4.columns_priv   记录已有用户对字段的权限

    mysql> grant update(name,class),insert on abc123.T3 to admin@192.168.142.129 identified by "123" with grant option;
    Query OK, 0 rows affected (0.07 sec)
    
    mysql> select *from columns_priv;
    +-----------------+--------+-------+------------+-------------+---------------------+-------------+
    | Host            | Db     | User  | Table_name | Column_name | Timestamp           | Column_priv |
    +-----------------+--------+-------+------------+-------------+---------------------+-------------+
    | 192.168.142.129 | abc123 | admin | T3         | name        | 0000-00-00 00:00:00 | Update      |
    | 192.168.142.129 | abc123 | admin | T3         | class       | 0000-00-00 00:00:00 | Update      |
    +-----------------+--------+-------+------------+-------------+---------------------+-------------+
    2 rows in set (0.00 sec)

    1.6撤销授权 revoke 权限 on 库名.表名 from 用户@"客户端地址";

    ####这里撤销的只是权限,但是不管怎么撤销,授权用户依然可以登录数据库,只有drop  user 用户名@"客户端地址";才可以删除授权用户

    mysql> revoke grant option on abc123.T3 to admin@192.168.142.129;####取消一下授权用户的授权权限
    mysql> select * from tables_priv where user="admin";######这时表权限就没有了grant权限
    +-----------------+--------+-------+------------+----------------+---------------------+---------------+-------------+
    | Host            | Db     | User  | Table_name | Grantor        | Timestamp           | Table_priv    | Column_priv |
    +-----------------+--------+-------+------------+----------------+---------------------+---------------+-------------+
    | 192.168.142.129 | abc123 | admin | T3         | root@localhost | 0000-00-00 00:00:00 | Insert,Update | Update      |
    +-----------------+--------+-------+------------+----------------+---------------------+---------------+---------

    1.7删除授权用户

    drop  user 用户名@"客户端地址"

    mysql> select user,host from user;
    +-------+-----------------------+
    | user  | host                  |
    +-------+-----------------------+
    | root  | 127.0.0.1             |
    | admin | 192.168.142.129       |
    | root  | ::1                   |
    |       | localhost             |
    | mydb  | localhost             |
    | root  | localhost             |
    |       | localhost.localdomain |
    | root  | localhost.localdomain |
    +-------+-----------------------+
    8 rows in set (0.00 sec)
    
    mysql> drop user mydb@localhost;
    Query OK, 0 rows affected (0.04 sec)
    
    mysql> select user,host from user;
    +-------+-----------------------+
    | user  | host                  |
    +-------+-----------------------+
    | root  | 127.0.0.1             |
    | admin | 192.168.142.129       |
    | root  | ::1                   |
    |       | localhost             |
    | root  | localhost             |
    |       | localhost.localdomain |
    | root  | localhost.localdomain |
    +-------+-----------------------+
    7 rows in set (0.00 sec)

    1.8 管理root密码

     1)恢复root密码

      —root密码忘了怎么办

      1.停止MySQL服务程序

      systemctl stop mysqld.service

      2.跳过授权表启动MySQL服务程序

      这一步主要利用mysqld的 --skip-grant-tables选项

      修改my.cnf配置,在 [mysqld] 下 添加 skip_grant_tables=1启动设置:

      之后 启动数据库服务:systemctl start mysqld.service

      直接以 mysql命令 进入数据库

      3.修改root密码

      在user表下修改用户密码:

    mysql> update mysql.user set  authentication_string=password("123") where user="root" and host="localhost";
    Query OK, 1 row affected (0.04 sec)
    Rows matched: 1  Changed: 1  Warnings: 0

      之后刷新一下数据率:flush privileges;

      (通过执行“FLUSH PRIVILEGES;”可使授权表立即生效,对于正常运行的MySQL服务,也可以用上述方法来修改密码,不用重启服务。本例中因为是恢复密码,最好重启MySQL服务程序,所以上述“FLUSH PRIVILEGES;”操作可跳过。)

      exit退出数据库

      在/etc/my.cnf下把刚设置的skip_grant_tables=1 注释掉

      重新启动一下服务

    4.以正常方式重启MySQL服务程序

    这时再以 mysql -hlocalhost  -uroot  -p"密码"登录即可

    [root@localhost ~]# mysql -hlocalhost -uroot -p123
    Warning: Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 3
    Server version: 5.6.45 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    mysql> 

    这时查看一下mysql 库下的user表下的密码验证字段

    mysql> select  authentication_string from mysql.user where user="root" and host="localhost"G;
    *************************** 1. row ***************************
    authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
    1 row in set (0.00 sec)

    2)重置数据库密码:

    方法一:在shell脚本命令行重置密码

    [root@dbsvr1 ~]# mysqladmin -uroot -p password 'A…qqq321'                    
    Enter password:                                   //验证原来的密码

    方法二:以管理员身份登入数据库后修改grant

    mysql> GRANT all ON *.* TO root@localhost IDENTIFIED BY '1234567';

    3)方法3,以root登入mysql> 后,使用UPDATE更新相应的表记录

    mysql> UPDATE mysql.user SET authentication_string=PASSWORD('1234567')
        -> WHERE user='root' AND host='localhost';          //重设root的密码
    Query OK, 0 rows affected, 1 warning (0.00 sec)

    4)数据库下使用set

    mysql> SET PASSWORD FOR root@localhost=PASSWORD('1234567');

    如果有报错,>mysql 下使用刷新命令

    2.数据备份与恢复

      2.1数据备份 目的

      当数据丢失或损坏时可以使用备份恢复

      2.2 数据备份的方式

      1) 物理备份:cp  tar scp 

          恢复:在另一台主机上获得备份的数据,放于/var/lib/mysql下(把数据库数据文件夹给备份下来)

      2)逻辑备份:(使用软件自带的备份程序做备份,执行备份命令时,会根据已有的数据生成对应的命令,把命令存放到指定的备份文件里

              恢复时执行备份文件里的命令恢复)

             mysqldump   备份命令

             mysql  恢复命令

    2.3 数据备份的策略

      完全备份

        —备份所有数据

      增量备份

        —备份上次的备份后,所有新产生的数据(每一次都和上一次相比,备份多出来的数据)

       差异备份:

        —备份完全备份后,所有新产生的数据(每一次都与完全备份相比,备份与完全备份不同的一部分,某些数据可能会重复备份)

    2.4 完全备份

      命令:mysqldump -uroot -p“密码” 库名   > 目录/XXX.sql

      备份时的库名表示方式

      — --all-databases 或-A    //所有库

      —数据库名                //单个库

      —数据库名   表名    //单张表

      —-B  数据库1   数据库2    //多个库

      无论是备份还是恢复,都要验证用户权限

    2.5 完全恢复

      如果是只备份了一个库,那么需要在数据库中建立这个库的库名,然后使用mysql -uroot -p密码 库名 < 目录/xxx.sql

      若是使用 -B,那么就无需建立库名,备份和恢复命令里会自动处理

    3. 增量备份

      使用mysql服务的binlog日志实现数据的增量备份与恢复

     3.1binlog日志的使用

        3.1.1binlog 日志介绍

          1)也叫做二进制文件

          2)MySQL服务日志文件的一种

          3)记录处查询之外的所有sql命令

          4)可用于数据的备份与恢复

          5)配置MySQL主从同步的必要条件

        3.1.2启用日志

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

        配置项           用途

        server_id=数字        指定id值(1-255,即启动服务的主机名)

        log-bin=目录名/文件名      启用日志

        max_binlog_size=数值m    指定日志文件的容量(当超过这个容量时,就开始另起一个日志文件默认大小为1G)

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

        启动:在配置文件中[mysqld]下中指定id值和启动

        

    [mysqld]
    server_id=140
    log_bin

    然后重启一下mysqld 服务

    查看是否已经启动,可以登入数据率查看:

    命令:show master status可以查看当前使用的日志文件名称

    mysql> show master status;
    +-------------------+----------+--------------+------------------+-------------------+
    | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +-------------------+----------+--------------+------------------+-------------------+
    | mysqld-bin.000002 |      120 |              |                  |                   |
    +-------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)

    或者可以在/var/lib/mysql   下查看到日志文件

    mysql> system ls /var/lib/mysql
    abc      db3           ib_logfile1      mysqld-bin.000002  performance_schema
    abc123      ibdata1      mysql          mysqld-bin.index
    auto.cnf  ib_logfile0  mysqld-bin.000001  mysql.sock

    其中mysqld-bin.XXXXXX为日志文件,mysqld-bin.index 为所有日志文件的索引,也就是说所有的日志文件的名字都存放在里面

    可以查看一下这个索引:这里的文件名都是按照 主机名-bin-编号命名,位置也是默认在数据库文件下

    mysql> system cat /var/lib/mysql/mysqld-bin.index
    ./mysqld-bin.000001
    ./mysqld-bin.000002

    自定义日志文件的位置和名称:log-bin=XXX/XXX(不要建在root下就好)

    要事先建立好文件夹,并赋予mysql 用户权限

        3.1.3手动创建新的binlog日志文件

          1)systemctl reatart mysqld   只要重启一下数据库服务就会生成一个新的日志文件

          2)flush logs;刷新一次生成一个新的日志文件

          3)命令行下 mysql -uroot -p密码 -e "flush logs"  (其实和 2)一个意思,只是一个在命令行下,一个在服务中),-e 是选项

          4)mysqldump  --flush-logs   (在备份数据库后新建一个日志)

          (一般后三种用的较多)

        3.1.4删除已有的binlog日志

          1)删除指定编号前的日志文件

            purge master logs to "binlog文件名"

          2)删除所有的binlog日志文件,重建新日志(删除所有日志后,会再建一个新的)

          reset master

        3.1.5查看日志内容

         1)查看内容

        mysqlbinlog /日志文件所在地址      可查看(在没有改变文件格式之前是乱码)

    [root@localhost ~]# mysqlbinlog /var/lib/mqsql/mysqld-bin.000001;   ####在命令行下执行
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
    /*!40019 SET @@session.max_insert_delayed_threads=0*/;
    /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
    DELIMITER /*!*/;
    mysqlbinlog: File '/var/lib/mqsql/mysqld-bin.000001' not found (Errcode: 2 - No such file or directory)
    DELIMITER ;
    # End of log file
    ROLLBACK /* added by mysqlbinlog */;
    /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
    [root@localhost ~]# 

        2)如何区分记录的多条命令

          1.偏移量:position

    mysql> show master status;
    +-------------------+----------+--------------+------------------+-------------------+
    | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +-------------------+----------+--
    ------------+------------------+-------------------+ | mysqld-bin.000001 | 120 | | | | +-------------------+----------+--------------+------------------+-------------------+

    show master status; 其中的position 为日志结点,若结点数值不变,那么就是数据库没有更新,日志没有改变

          --start-position=数字   起始偏移量

          --stop-position =数字  结束偏移量

          2.时间结点:

           --start-datetime ="yyyy-mm-dd hh:mm:ss"   起始时间

           --stop-datetime ="yyyy-mm-dd hh:mm:ss"  结束时间

          (只要是改变数据的命令就会有对应的偏移量和时间结点)

     3)查看日志当前格式:日志文件转化成我们能看懂的格式,就可以观察到变化的格式命令  

         日志文件的三种格式: statement       报表模式

                   row      行模式

                   mixed    混合模式

    show variables like "binlog_format" 可以查看当前文件格式,format为变量

    mysql> show variables like "binlog_format";
    +---------------+-----------+
    | Variable_name | Value     |
    +---------------+-----------+
    | binlog_format | STATEMENT |
    +---------------+-----------+

    要将格式改为混合模式

    步骤:  在配置文件中更改,改完需重启服务

        /etc/my.cnf

        [mysqld]

        binlog_format="MIXED"

       然后使用mysqlbinlog 来查看

     4)使用日志进行恢复/(这是在需要备份的客户端操作)

      mysqlbinlog  /日志目录    |   mysql -uroot -p密码

    (将日志文件拷给备份的主机,然后把读取的日志内容管道给数据库做处理)

     若选择性读取日志文件 则   mysqlbinlog --start-position=开始偏移量 --stop-position=结束偏移量  /目录文件   |   mysql -uroot -p密码

    如何找偏移量:

    [root@localhost ~]# mysqlbinlog /var/lib/mysql/mysqld-bin.000003
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
    /*!40019 SET @@session.max_insert_delayed_threads=0*/;
    /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
    DELIMITER /*!*/;
    # at 4
    #191001  8:29:28 server id 129  end_log_pos 120 CRC32 0xd69d903f     Start: binlog v 4, server v 5.6.45-log created 191001  8:29:28 at startup
    ROLLBACK/*!*/;
    BINLOG '
    6J2SXQ+BAAAAdAAAAHgAAAAAAAQANS42LjQ1LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAADonZJdEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAT+Q
    ndY=
    '/*!*/;
    # at 120
    #191001  8:35:37 server id 129  end_log_pos 197 CRC32 0x3ddc78ef     Query    thread_id=2    exec_time=0    error_code=0
    SET TIMESTAMP=1569890137/*!*/;
    SET @@session.pseudo_thread_id=2/*!*/;
    SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
    SET @@session.sql_mode=1075838976/*!*/;
    SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
    /*!C utf8 *//*!*/;
    SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
    SET @@session.lc_time_names=0/*!*/;
    SET @@session.collation_database=DEFAULT/*!*/;
    BEGIN
    /*!*/;
    # at 197
    #191001  8:35:37 server id 129  end_log_pos 320 CRC32 0xb108bd32     Query    thread_id=2    exec_time=0    error_code=0
    SET TIMESTAMP=1569890137/*!*/;
    insert into abc123.T3 values("rt","2",23,"game",89)  ###如找这一条插入命令的开始与结束偏移量,往上找#开始的为开始偏移量
    /*!*/;
    # at 320    ###320 为输完insert 命令后的偏移量,这一条命令还没有执行
    #191001  8:35:37 server id 129  end_log_pos 351 CRC32 0x85bec906     Xid = 10
    COMMIT/*!*/;###commit 为提交,即回车后提交
    # at 351   ###  这一条命令为用户按完回车后正式插入的偏移量
    #191001  8:56:57 server id 129  end_log_pos 374 CRC32 0x301e7b58     Stop
    DELIMITER ;
    # End of log file
    ROLLBACK /* added by mysqlbinlog */;
    /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
    [root@localhost ~]# 

    故这一条插入命令的偏移量为  197-351

  • 相关阅读:
    乘坐飞机时,有什么事情是机长和机上工作人员不想让乘客知道的?
    北京有哪些被废弃的地方值得一看?推荐理由是什么?
    在读硕士或博士是如何养活自己的?
    怎样有效提高记忆力?
    北京值得去的、不为人知的景点(或展览馆、美术馆、公园)有哪些?
    你收藏了哪些藏品?
    如何抓到入侵网站的黑客?
    中国姓氏的区域性?
    python之入门,你好,中国
    Eclipse 内置浏览器
  • 原文地址:https://www.cnblogs.com/zhanglei97/p/11610473.html
Copyright © 2020-2023  润新知