顯示具有 資料庫 標籤的文章。 顯示所有文章
顯示具有 資料庫 標籤的文章。 顯示所有文章

2018年7月11日 星期三

Debian 9.4 安裝配置 MariaDB (MySQL)

本文參考https://ralf.ren/1717國立白河商工日誌
Debian 9 使用 MariaDB 徹底代替了 MySQL。相較於 mariadb-server,使用 mysql-server 能夠保證對 MySQL 的兼容性。
  1. 安裝MariaDB (MySQL)
    apt-get install mysql-server
  2. 如果允許遠端連線資料庫(非必須)
    vim /etc/mysql/mariadb.conf.d/50-server.cnf 將bind-address=127.0.0.1改成可連線的網段或0.0.0.0全部開放(mark起來也可)
  3. 使用原生 MySQL 認證
    因為默認使用了 UNIX SOCKET 認證,有些 phpMyAdmin 在登入時會發生 「Access Denied」 錯誤。我們可以更改 UNIX SOCKET 認證為原生 MySQL 認證。
    • update mysql.user set plugin = 'mysql_native_password' where User='root';
    • flush privileges;
  4. 修改root密碼
    • 方式一:
      mysqladmin -u root password 'new_password'
    • 方式二
      mysql直接進入資料庫
      Grant All Privileges On *.* To root@localhost Identified By 'password' With Grant Option;
      • Grant All Privileges : 代表將所有權限授權給
      • On *.* : 代表在那裡,第一個*為資料庫名稱,第二個星為資料表名稱,*.*為全部授權的意思
      • To root@localhost : 代表給 localhost 上的 root 這個人
      • Identified By ‘password’ : 在此輸入密碼
      • With Grant Option; : 表示這個使用者可以再 Grant 權限給其它使用者
      • 在使用 Grant 指令時,每個指令的第一個字要大寫
      • 這樣就完成權限設定的動作了
  5. 重新啟用資料庫
備註:
  1. 考量當初資料庫預設字元為Latin1,新系統已將之改為utf8mb4,若要沿用:
    • 將/etc/mysql/mariadb.conf.d/50-server.cnf
      • #character-set-server  = utf8mb4
      • #collation-server      = utf8mb4_general_ci
    • 將/etc/mysql/mariadb.conf.d/50-client.cnf
      • #default-character-set = utf8mb4
  2. 若要使用新版moodle或SFS3U,有必要將原系統innodb-base的文件格式Antelope改為Barracude(Antelope是innodb-base的文件格式,Barracude是innodb-plugin引入的文件格式,同時Barracude也支持Antelope文件格式。),可在50-server.cnf設定當中設定:(參考杜子的網管筆記
    • max_allowed_packet = 100M   (加入這行,可以讓轉碼時每次處理 5000筆以上,加快速度)
    •  innodb_file_format = Barracuda
    •  innodb_file_format_max = Barracuda
    •  innodb_file_per_table = 1
    •  innodb_large_prefix

2017年8月11日 星期五

mysql資料庫備份與還原

一、先做資料庫檢查
  • mysqlcheck -u root -p 資料庫名稱 (有InnoDB資料表使用)
  • mysqlcheck -u root -p -r 資料庫名稱 (舊資料庫MyISAM資料表使用--不可有InnoDB資料表)
二、資料庫備份
  • mysqldump -u root -p 資料庫名稱 --default-character-set=latin1 > XXXXX_DB.sql
  • mysqldump -u root -p 資料庫名稱 --default-character-set=latin1 | gzip > XXXX_DB.sql.gz (使用gzip壓縮)
三、資料庫還原
  • 取回 XXXX.sql (若為壓縮檔,利用gunzip解壓縮)
  • 把原有欲更新的舊資料庫刪除(mysqladmin -u root -p drop 資料庫名稱)
  • mysqladmin -u root -p create 資料庫名稱
  • mysql -u root -p 資料庫名稱 < XXXX.sql

2016年3月21日 星期一

將學籍主機IP、資料庫帳密,供縣OpenID主機定時連線取得OpenID單一認證資料

  1. vim /etc/hosts.allow,在 mysqld 的連線範圍內,加入縣網主機IP:163.23.200.2
    sshd:172.16.3.2
    mysqld:localhost, 127.0.0.1, 163.23.200.2
  2. 防火牆程式,開放3306埠。vim /bin/firewall.sh
    iptables -I INPUT -p tcp -s 163.23.200.2 --dport 3306 -j ACCEPT
  3. 設定資料庫使用者與授權
    假設貴校的學籍系統資料庫叫sfs3,而您提供的連線帳號叫openid,而密碼是chcopenid,則請在資料庫內執行下面三條指令。 您可自行依貴校資料庫名稱及所須的帳密設定,請記錄下來,以便申請時填寫。
    請先登入資料庫後再執行下面三行指令,就完成了。[登入資料庫] mysql -uroot -p
    1. GRANT SELECT ON sfs3.student_view TO openid@163.23.200.2 IDENTIFIED BY 'chcopenid';
    2. GRANT SELECT ON sfs3.teacher_course_view TO openid@163.23.200.2 IDENTIFIED BY 'chcopenid';
    3. GRANT SELECT ON sfs3.teacher_post_view TO openid@163.23.200.2 IDENTIFIED BY 'chcopenid';
  4. vim /etc/mysql/my.cnf
    bind-address = 127.0.0.1  改為 bind-address = 163.23.115.67 (直接把它mark起來,不知行不行)

2016年3月17日 星期四

base資料處理

一、重覆資料單一化(找出家長會費名單)
 本來想使用base資料庫來處理,例如:
  1. select DISTINCT 欄位 from 資料表
  2. select 欄位 from 資料表 group by 欄位(資料單一化的欄位)
 可惜只能呈現單一欄位!
 只有使用cale試算表,土法煉鋼:以家長名單為例
  1. 監護人欄位排序
  2. 監護人欄位儲存格與上一筆儲存格做比較,例如:IF(D2=D1,0,1),相同者為0;不同者為1
  3. 將比較結果複製、選擇性貼上為數值(值)
  4. 將比較結果排序,將0的資料列刪除
  5. 班級座號排序
 二、base資料庫(參見教學資料)
  1. 差集運算
    SELECT * FROM 母群體資料表(單一) WHERE 關鍵欄位 NOT IN ( SELECT 關鍵欄位 FROM 子群體資料表 )
  2. 聯集運算
    SELECT 欄位1,欄位2 FROM 資料表1 UNION SELECT 欄位1,欄位2 FROM 資料表2
  3. 交集運算
    SELECT 欄位1,欄位2 FROM 資料表1 INTERSECT SELECT 欄位1,欄位2 FROM 資料表2

2016年3月15日 星期二

MySQL 遠端連線設定

有些主機空間不開放使用 MySQL,這時就可以自己架一台 MySQL Server 並設定允許外部連線,讓沒有 MySQL 的主機也能使用。
方法很簡單,只要兩個關鍵步驟即可:
1) 開啟 TCP 3306 (預設 MySQL Port)。
2) 新增一個 User,主機(Host) 為允許連線的網域或 IP,如果不限制可以用「%」表任何主機。
如果不行請檢查 mysql 設定檔 (my.ini 或 my.cnf),註解下面文字
skip-networking
bind-address=127.0.0.1

2016年3月14日 星期一

pear的資料庫處理

新增.修改.刪除.瀏覽,資料庫四大功能.
一. 新增
            $table_name = 'goodurl_cat';
            $table_fields = array('category_title','rank','username');
            $datas = array(stripslashes($_POST['category_title']),$_POST['rank'],$authUsername);
            $pre = $db->autoPrepare($table_name,$table_fields,DB_AUTOQUERY_INSERT);
            $db->execute($pre,$datas);
二. 修改
            $table_name = 'goodurl_cat';
            $table_fields = array('category_title','rank');
            $datas = array(stripslashes($_POST['category_title']),$_POST['rank']);
            $pre = $db->autoPrepare($table_name,$table_fields,DB_AUTOQUERY_UPDATE,"category_id=".$_POST['category_id']);
            $db->execute($pre,$datas);
三. 刪除
            $db->query(sprintf("DELETE FROM goodurl_cat WHERE category_id in (%s)",implode(",",$_POST['cids'])));
四. 瀏覽
        $strSearch = trim($_GET['search']);
        $strWhere = ($strSearch == '') ? '' : " and (locate('$strSearch',category_title)>0 or locate('$strSearch',name)>0)";
        if (!$isAll) $strWhere .= " and goodurl_cat.username='".$authUsername."'";
        $query = "select goodurl_cat.*,name from goodurl_cat join user on goodurl_cat.username=user.username where category_id>0 $strWhere order by rank ASC,category_id DESC";
        $rows = $db->getAll($query);