MySQL:常见使用问题

内容

如今想用silverlight做过网站,在做笔录网站访问总人数和在线人数那一个小成效时候,不想行使读取数据库,然后再写入数据库的法子,因为觉的只是简单的笔录,没必要那么费力,于是利用直接读取写入txt记事本的点子,没悟出其中碾碾转转,采用三种方法,最终才促成形成,下边我想谈谈自己的完成的全部过程,包括战败的:

 

     格局一:选择的是在客户端间接读取写入措施。

1、Linux 上安装MySQL

安装步骤:

1)解压 tar.gz文件

shell> tar -zxvf mysql-5.7.9-linux-glibc2.5-x86_64.tar.gz

 

2)初叶化默认数据库(mysql、performace_schema、sys、information_schema)

在/home/bes/jinuo/mysql 目录下的结构如下:

/home/bes/jinuo/mysql
                     /mysql-5.7.9-glibc2.5-x86_64
                           /bin
                           /docs
                           /include
                           /lib
                           /man
                           /share
                           /support-files
                    /test
                         /ins1
                              /my-default.cnf

 

拷贝 support-files
目录到你想要做mysql实例的目录下,并编制如下:

[mysqld]
basedir=/home/bes/jinuo/mysql/mysql-5.7.9-linux-glibc2.5-x86_64
datadir=/home/bes/jinuo/mysql/test/ins1/datadir
port=36001
server_id=36001
socket=/home/bes/jinuo/mysql/test/ins1/mysql.sock
log-error=/home/bes/jinuo/mysql/test/mysqld.log
explicit_defaults_for_timestamp=true
character-set-server=utf8
collation-server=utf8_general_ci
skip-host-cache
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

下一场实施如下命令起头化:

普通用户可以直接执行如下命令:

shell> bin/mysql_install_db    # Before MySQL 5.7.6
shell> bin/mysqld --initialize   # MySQL 5.7.6 and up

 假若是操作每户的root用户创设mysql实例,创建实例时,需要指定为哪个用户创立的实例。

也就是说,如若您是一个普通用户 hello, 你可以动用下面 的下令直接创设自己的实例。

只要要让root用户给您创建实例,需要在地方命令前边加上 –user=hello 参数。

 

root用户:
shell>mysqld --defaults-file=/your/mysql/cnf/path --initialize-insecure --user=username

普通用户: 
shell>mysqld --defaults-file=/your/mysql/cnf/path --initialize-insecure

 

在起先化时,会为mysql root用户
创设一个暂时密码。临时密码的岗位能够这样找到:

               

MySQL 5.6.x :

A RANDOM PASSWORD HAS BEEN SET FOR THE MySQL root USER !
You will find that password in '/root/.mysql_secret'.
You must change that password on your first connect,
no other statement but 'SET PASSWORD' will be accepted.
See the manual for the semantics of the 'password expired' flag.
Also, the account for the anonymous user has been removed.

MySQL 5.7.x :

如果初始化时使用的是  --initialize:
# tail -n1 /home/bes/jinuo/mysql/test/ins1/mysqld.log
2016-12-11T07:47:58.199154Z 1 [Note] A temporary password is generated for root@localhost: wzgds/:Kf2,g

如果

初始化时使用的是  --initialize-insecure:

  # tail -n1 /var/log/mysql/error.log
  2016-12-11T07:51:28.506142Z 1 [Warning] root@localhost is created
with an empty password ! Please consider switching off the –initialize-insecure option

 所以,如要是5.7以上的本子,提议拔取 –initialize-insecure形式来成立实例。这样就足以一向动用mysqladmin来修改root密码了。参见4)。

 

 

3)启动数据库

启动MySQL Server:

shelll> /home/bes/jinuo/mysql/mysql-5.7.9-linux-glibc2.5-x86_64/bin/mysqld --defaults-file=/home/bes/jinuo/mysql/test/ins1/my-default.cnf &

 

4)知道密码处境下,修改密码

mysqladmin
提供了一套mysql的保管命令,其中有一个是password命令,用于修改密码的。使用mysqladmin
来修改密码的前提是你了然密码,因为它其中是先拔取现有登录到mysql
server,然后修改密码。

可以直接选取mysqladmin命令来修改密码。例如修改root密码,由设置后的
空密码修改为 12345678

mysqladmin -u root --socket=/home/bes/mysql/mysql.sock password 12345678

比方在动用过程中,想要更换密码由12345678变成123456:

mysqladmin -u root -p 12345678 --socket=/home/bes/mysql/mysql.sock password 123456

修改其它用户的密码,是千篇一律 的方法。

 

5)为root授权限

 

mysql> grant all on *.* to 'root'@'%' identified by 'yourRootPassword';

 

                     代码如下:StreamResourceInfo text =
Application.GetResourceStream(new Uri(“txt/河流总集合.txt”,
UriKind.RelativeOrAbsolute));

2、单机多实例安装

假使在一台机械上,要安装六个mysql实例,只需要将再度执行
1中的2)3)4)5)就可以了。

 

 

                                                         using
(StreamReader read = new StreamReader(text.Stream))

3、 不知root密码意况下,修改root密码、授权

该方法适用于,有root密码,然而不晓得root 密码情状下。

 

       a: 停止 MySQL Server

       b: 绕过授权检查办法启动MySQL Server

            

shell> /home/bes/jinuo/mysql/mysql-5.7.9-linux-glibc2.5-x86_64/bin/mysqld --defaults-file=/home/bes/jinuo/mysql/test/ins1/my-default.cnf --skip-grant-tables &

       c: root用户登录到mysql server上,并切换来mysql 库

  

shell> /home/bes/jinuo/mysql/mysql-5.7.9-linux-glibc2.5-x86_64/bin/mysql --socket=/home/bes/jinuo/mysql/test/ins1/mysql.sock -uroot -p

mysql> use mysql;

 

       d: 修改root 用户的密码: 

    

mysql> update mysql.user set authentication_string = password('mypassword') where user = 'root';
mysql> flush privileges;
mysql> quit;

        e: 截止mysql server,正常启动。

        正常启动的法门在面前 3)中已说过。

        f: root 登录后,举办授权调整:

       

shell> /home/bes/jinuo/mysql/mysql-5.7.9-linux-glibc2.5-x86_64/bin/mysql --socket=/home/bes/jinuo/mysql/test/ins1/mysql.sock -uroot -p
Enter Password

mysql> grant all on *.* to 'root'@'%' identified by 'yourRootPassword';

 

 

 

 

 

     

                                                                  {

                                                                       
          string line = read.ReadLine();

                                                                       
          read.Close();

                                                                  }

 

                                                         using
(StreamWriter writer= new StreamWriter(text.Stream))

                                                                  {

                                                                       
         writer.WriterLine((Convert.ToInt32(line) + 1).ToString());

                                                                       
          read.Close();

                                                                  }

                   
这种方法在客户端读取是没问题的,可是在写入writer时候就会抛出万分,说是权限问题,不领悟是否有其余的点子在客户端直接写入的?

   格局二:拔取单独存储文件措施IsolatedStorageFile

                   代码如下:           
////////////////////////////////读txt
                                                  IsolatedStorageFile
isf = IsolatedStorageFile.GetUserStoreForApplication();
                                                 Stream stream = new
IsolatedStorageFileStream(“MyText.txt”, System.IO.FileMode.Open,
System.IO.FileAccess.Read, isf);
                                                 System.IO.TextReader
reader = new System.IO.StreamReader(stream);
                                                 string sLine =
reader.ReadLine();
                                                 reader.Close(); //
Close the reader
                                                 stream.Close(); //
Close the stream
                                               
//////////////////////////////////写txt
                                               IsolatedStorageFile isf1
= IsolatedStorageFile.GetUserStoreForApplication();
                                              Stream stream1 = new
IsolatedStorageFileStream(“MyText.txt”, System.IO.FileMode.Create,
System.IO.FileAccess.Write, isf1);
                                              System.IO.TextWriter
writer = new System.IO.StreamWriter(stream1);
                                           
 writer.WriteLine((Convert.ToInt32(sLine) + 1).ToString());
                                             writer.Close(); // Close
the reader
                                             stream1.Close(); // Close
the stream

                 
这种方法在单机运行,没发布时候是一向不问题的,具体问题见:http://bbs.csdn.net/topics/390304940,到现在我也不明白为什么会这样,以IP形式运行就会出现异常,以localhost形式就没问题,不知道是否也是权限访问问题没?

   
格局三:在论坛里,luoSaiMingJavaAndC网友给自己指导了,相比麻烦点的章程-WCF,调用公布服务的花样,在此非凡感谢luoSaiMingJavaAndC给我的笔触,思路如下:现在后台发表好服务,然后在前台调用。

                    后台服务模块:       [WebMethod]
        public string Readtxt(string path)
        {
            string line = “”;
            try
            {
                using (StreamReader myreader = new StreamReader(“F:/” +
path + “.txt”))
                {
                    line = myreader.ReadLine();
                    myreader.Close();
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            return line;
        }
        /// <summary>
        /// 登录时候添加在线人数、总人数 +1
        /// </summary>
        /// <param name=”path”></param>
        /// <param name=”Readline”></param>
        [WebMethod]
        public void WritetxtAdd(string path, string Readline)
        {
            //string line = “”;
            try
            {
                using (StreamWriter mywrite = new StreamWriter(“F:/” +
path + “.txt”))
                {
                    mywrite.WriteLine((Convert.ToInt32(Readline) +
1).ToString());
                    mywrite.Close(); // Close the reader
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            //return line;
        }
        /// <summary>
        /// 注销时候、退出时候在线人数、总人数-1
        /// </summary>
        /// <param name=”path”></param>
        /// <param name=”Readline”></param>
        [WebMethod]
        public void WritetxtSub(string path, string Readline)
        {
            //string line = “”;
            try
            {
                using (StreamWriter mywrite = new StreamWriter(“F:/” +
path + “.txt”))
                {
                    if (Convert.ToInt32(Readline) – 1 >= 0)
                    {
                        mywrite.WriteLine((Convert.ToInt32(Readline) –
1).ToString());
                    }
                    else
                    {
                        mywrite.WriteLine(“0”);
                    }
                    mywrite.Close(); // Close the reader
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            //return line;
        }

 

客户端调用服务代码:          

            MytxtSoapClient = new Mytxt.MytxtSoapClient();
            MytxtSoapClient.ReadtxtCompleted += new
EventHandler<Mytxt.ReadtxtCompletedEventArgs>(MytxtSoapClient_ReadtxtCompleted);
            MytxtSoapClient.ReadtxtAsync(“访问总人数”);
            MytxtSoapClient1 = new Mytxt.MytxtSoapClient();
            MytxtSoapClient1.ReadtxtCompleted += new
EventHandler<Mytxt.ReadtxtCompletedEventArgs>(MytxtSoapClient_ReadtxtCompleted1);
            MytxtSoapClient1.ReadtxtAsync(“当前在线人数”);

       /// <summary>
        /// 先读访问总人数txt,再拜访总人数+1
        /// </summary>
        /// <param name=”sender”></param>
        /// <param name=”e”></param>
        private void MytxtSoapClient_ReadtxtCompleted(object sender,
Mytxt.ReadtxtCompletedEventArgs e)
        {
            string readtxt = e.Result.ToString();
            MytxtSoapClient2 = new Mytxt.MytxtSoapClient();
            MytxtSoapClient2.WritetxtAddAsync(“访问总人数”, readtxt);
           // login = true;
        }
        /// <summary>
        /// 先读当前在线人数txt,再当前在线人数+1
        /// </summary>
        /// <param name=”sender”></param>
        /// <param name=”e”></param>
        //bool login = false;
        private void MytxtSoapClient_ReadtxtCompleted1(object sender,
Mytxt.ReadtxtCompletedEventArgs e)
        {
            string readtxt = e.Result.ToString();
            MytxtSoapClient3 = new Mytxt.MytxtSoapClient();
            MytxtSoapClient3.WritetxtAddAsync(“当前在线人数”,
readtxt);
            //InitialPage myp = this.Parent as InitialPage;
            //myp.gotopage(new MainPage());
            //login = true;
        }
        /// <summary>
        /// 先读当前在线人数txt,再当前在线人数-1
        /// </summary>
        /// <param name=”sender”></param>
        /// <param name=”e”></param>
        private void MytxtSoapClient_ReadtxtCompleted2(object sender,
Mytxt.ReadtxtCompletedEventArgs e)
        {
            string readtxt = e.Result.ToString();
            MytxtSoapClient4 = new Mytxt.MytxtSoapClient();
            MytxtSoapClient4.WritetxtSubAsync(“当前在线人数”,
readtxt);
        }

这种措施也有个问题亟须要控制好,这就是共同异步问题,我在贯彻的长河中就涌出某些问题,在登陆页面登陆时候实现了总人数、在线人数均+1,可是跳到主页面时候,却不曾共同更新,主页面读取的依然原来的数目,必须要刷新一遍才显得新的txt数据。

登陆页面的登陆按钮事件:

        private void Login_click(object sender, RoutedEventArgs e)
        {

            MytxtSoapClient = new Mytxt.MytxtSoapClient();
            MytxtSoapClient.ReadtxtCompleted += new
EventHandler<Mytxt.ReadtxtCompletedEventArgs>(MytxtSoapClient_ReadtxtCompleted);
            MytxtSoapClient.ReadtxtAsync(“访问总人数”);
            MytxtSoapClient1 = new Mytxt.MytxtSoapClient();
            MytxtSoapClient1.ReadtxtCompleted += new
EventHandler<Mytxt.ReadtxtCompletedEventArgs>(MytxtSoapClient_ReadtxtCompleted1);
            MytxtSoapClient1.ReadtxtAsync(“当前在线人数”);
            /////////////////////////////////////
                InitialPage myp = this.Parent as InitialPage;
                myp.gotopage(new MainPage());

        }

     
这里我觉着是按代码的顺便来的,顺着我的思绪,先读取txt再写入+1,之后才跳转到主页面MainPage的,结果断点跟踪时候发现不是。

主页面读取:

        public MainPage()

{

            MytxtSoapClient = new Mytxt.MytxtSoapClient();
            MytxtSoapClient.ReadtxtCompleted += new
EventHandler<Mytxt.ReadtxtCompletedEventArgs>(MytxtSoapClient_ReadtxtCompletedOnlyread);
            MytxtSoapClient.ReadtxtAsync(“访问总人数”);
            MytxtSoapClient1 = new Mytxt.MytxtSoapClient();
            MytxtSoapClient1.ReadtxtCompleted += new
EventHandler<Mytxt.ReadtxtCompletedEventArgs>(MytxtSoapClient_ReadtxtCompleted1onlyread);
            MytxtSoapClient1.ReadtxtAsync(“当前在线人数”);

}

到这边可能是一同问题所导致的,luoSaiMingJavaAndC又给本人带领了linq  to  rx
思路,说是 对异步控制很好,让我尝试一下!对于linq这种方法本身不是很熟练,我是菜鸟来的,以前读取数据库都是这种模式:先连续数据库再读取数据、操作数据,最后再关闭的,很古老的法子,对于这种linq绑定数据库控件情势通晓不多。听取luoSaiMingJavaAndC意见,我去学学了解linq格局,最终到底解决了这么些题目,十分感谢luoSaiMingJavaAndC对本身的赞助,衷心的感谢!

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注