VPS重做系统都需要做什么
重做系统都快成日常了,看来还是需要整理一下。
重做系统都快成日常了,看来还是需要整理一下。
-- 为当前表添加主键
ALTER TABLE `tablename`
ADD COLUMN id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (id);
-- 删除主键
ALTER TABLE `tablename`
DROP PRIMARY KEY;
# utf8mb4_unicode_ci更准
CREATE DATABASE IF NOT EXISTS typecho DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
# utf8mb4_general_ci更快
CREATE DATABASE IF NOT EXISTS typecho DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE DATABASE typecho DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
# 只是创建用户
CREATE USER phpergao@'localhost' IDENTIFIED BY 'yourpasswd';
# 赋予权限
GRANT select,update on phpergao.* to phpergao@'localhost';
GRANT index ON phpergao.* TO phpergao@'192.168.0.%';
# 创建用户并赋予权限
GRANT ALL PRIVILEGES ON phpergao.* TO 'phpergao'@'localhost' IDENTIFIED BY 'yourpasswd';
# 相反的revoke 跟 grant 的语法差不多,只需要把关键字 “to” 换成 “from” 即可:
REVOKE ALL PRIVILEGES ON phpergao.* FROM 'phpergao'@'localhost';
# ALL PRIVILEGES 可以换为select,insert,update,delete,create,drop,index,alter,grant,references,reload,shutdown,process,file等14个权限。
# 删除用户
DELETE FROM user WHERE User='phpergao' and Host='localhost';
# 修改用户密码
UPDATE USER SET PASSWORD = PASSWORD ('newpasswd') WHERE USER = 'phpergao' AND HOST = 'localhost';
FLUSH PRIVILEGES;
# 查看自己的权限
SHOW GRANTS;
# 查看其他人的权限
SHOW GRANTS FOR 'phpergao'@'%';
DROP TABLE IF EXISTS `workers_info`;
CREATE TABLE `workers_info` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`workername` varchar(20) NOT NULL,
`sex` enum('F','M','S') DEFAULT 'S',
`salary` int(11) DEFAULT '0',
`email` varchar(30) DEFAULT NULL,
`EmployedDates` date DEFAULT NULL,
`department` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
修改配置文件
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# ADD
skip-name-resolve
skip-grant-tables
然后重启MySQL服务并免密码登录
service mysqld restart
mysql
执行修改密码SQL
将root用户的密码统一设为'admin'
UPDATE mysql.user SET Password=password('123456') WHERE User='root';
还原MySQL配置文件并重启服务
UPDATE mysql.user SET Host='&' WHERE User='root';
参考:
主服务器(master)IP:192.168.0.1 从服务器(slave)IP:192.168.0.2 首先确保主从服务器上的Mysql版本相同
创建用户名为repl的一个账户
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.2' IDENTIFIED BY 'xxxxxxxxx';
修改主数据库的配置文件my.cnf,开启BINLOG,并设置server-id的值,修改之后必须重启Mysql服务,如果不需要修改可不用重启。
server-id=1
log_bin = /usr/llocal/mysql/log/mysql-bin.log
之后可以得到主服务器当前二进制日志名和偏移量,这个操作的目的是为了在从数据库启动后,从这个点开始进行数据的恢复
flush tables with read lock; 这是session级,退出就隐式 unlock tables;
show master status;
生成主数据库的备份 如果mysqldump 无法识别,则在/home/mysql/.bash_profile 添加环境变量 export PATH=$PATH:/usr/local/mysql/bin mysqldump -p3306 -uroot –pxxxxxxxx test > test.sql unlock tables; 将备份出来的数据复制到从数据库
Scp test.sql 192.168.0.2:
将备份数据导入数据库
Mysql –uroot –pxxxxxxxx test < test.sql
修改从数据库的my.cnf,增加server-id参数,如有更改需要重启
server-id=2 # 注:一定不能跟主数据库一样
指定复制使用的用户,主数据库服务器的ip,端口以及开始执行复制日志的文件和位置
CHANGE MASTER TO MASTER_HOST='192.168.1.130', MASTER_USER='repl', MASTER_PASSWORD='456123', MASTER_LOG_FILE='mysql-bin.xxxx', MASTER_LOG_POS=xxxx;
MASTER_LOG_FILE=' mysql-bin.xxxx', MASTER_LOG_POS=xxxx 这俩个参数参见主服务器 show master status
启动slave进程
Start slave;
查看从服务器状态
Show slave status;
Slave_IO_Running: Yes //此状态必须YES
Slave_SQL_Running: Yes //此状态必须YES
在主数据库上插入一条数据,然后看从数据库是否有更新。然后就可以自己发挥了。总的来说就是一般用主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力,再通过高可用性(High Availability)确保服务的稳定。
mysql默认是禁用多表删除语句的,之前的做法都是先把条件缓存,然后逐条执行
delete from a where a.xxx in (123123,123123);
delete from b where b.xxxx in (123123,123123);
如果写成下面这种绝对是错误的!
delete * from a,b where xxxx in ...
今天突然发现原来mysql也是可以一条sql删除多表数据的,下面来分析一下 多表删除其实思路还是比较简单的,首先条件就是多个表(一般就两个表,织梦的文章信息存在3个表里,删除起来很麻烦)有关联 其次,删除条件一般都是由关联的这一行组成的,也可能不是,没有关系,我们先写一个试试:
DELETE p.*, pp.*
FROM pw_threads p, pw_tmsgs pp
WHERE p.tid = pp.tid
AND p.tid in(SELECT tid FROM pw_threads WHERE postdate>UNIX_TIMESTAMP('2014-06-12 00:00:00') and fid=136)
逻辑都通着,但是会报错
You can't specify target table 'A' for update in FROM clause 原因是: In general, you cannot modify a table and select from the same table in a subquery.
所以你需要把子查询改为临时表中,所以最终的查询就是
DELETE p.*, pp.*
FROM pw_threads p, pw_tmsgs pp
WHERE p.tid = pp.tid
AND p.tid in(SELECT tmp.tid FROM (SELECT * FROM pw_threads) as tmp WHERE tmp.postdate>UNIX_TIMESTAMP('2014-06-12 00:00:00') and tmp.fid=136)
搜PHP长链接把这个搜出来了,2006年的帖子比较久远了,希望对你有帮助!
转自http://bbs.phpchina.com/forum.php?mod=viewthread&tid=4577&page=1 中forest的回帖:
永久的数据库连接是指在脚本结束运行时不关闭的连接。当收到一个永久连接的请求时。PHP 将检查是否已经存在一个(前面已经开启的)相同的永久连接。如果存在,将直接使用这个连接;如果不存在,则建立一个新的连接。所谓“相同”的连接是指用相同的用户名和密码到相同主机的连接。
对 web 服务器的工作和分布负载没有完全理解的读者可能会错误地理解永久连接的作用。特别的,永久连接不会在相同的连接上提供建立“用户会话”的能力,也不提供有效建立事务的能力。实际上,从严格意义上来讲,永久连接不会提供任何非永久连接无法提供的特殊功能。
为什么?
这和 web 服务器工作的方式有关。web 服务器可以用三种方法来利用 PHP 生成 web 页面。
第一种方法是将 PHP 用作一个“外壳”。以这种方法运行,PHP 会为向 web 服务器提出的每个 PHP 页面请求生成并结束一个 PHP 解释器线程。由于该线程会随每个请求的结束而结束,因此任何在这个线程中利用的任何资源(例如指向 SQL 数据库服务器的连接)都会随线程的结束而关闭。在这种情况下,使用永久连接不会获得任何地改变――因为它们根本不是永久的。
第二,也是最常用的方法,是把 PHP 用作多进程 web 服务器的一个模块,这种方法目前只适用于 Apache。对于一个多进程的服务器,其典型特征是有一个父进程和一组子进程协调运行,其中实际生成 web 页面的是子进程。每当客户端向父进程提出请求时,该请求会被传递给还没有被其它的客户端请求占用的子进程。这也就是说当相同的客户端第二次向服务端提出请求时,它将有可能被一个不同的子进程来处理。在开启了一个永久连接后,所有请求 SQL 服务的后继页面都能够重新使用这个已经建立的 SQL Server 连接。
最后一种方法是将 PHP 用作多线程 web 服务器的一个插件。目前 PHP 4 已经支持 ISAPI、WSAPI 和 NSAPI(在 Windows 环境下),这些使得 PHP 可以被用作诸如 Netscape FastTrack (iPlanet)、Microsoft’s Internet Information Server (IIS) 和 O’Reilly’s WebSite Pro 等多线程 web 服务器的插件。永久连接的行为和前面所描述的多过程模型在本质上是相同的。注意 PHP 3 不支持 SAPI。
如果永久连接并没有任何附加的功能,那么使用它有什么好处?
答案非常简单――效率。当客户端对 SQL 服务器的连接请求非常频繁时,永久连接将更加高效。连接请求频繁的标准取决于很多因素。例如,数据库的种类,数据库服务和 web 服务是否在同一台服务器上,SQL 服务器如何加载负载等。但我们至少知道,当连接请求很频繁时,永久连接将显著的提高效率。它使得每个子进程在其生命周期中只做一次连接操作,而非每次在处理一个页面时都要向 SQL 服务器提出连接请求。这也就是说,每个子进程将对服务器建立各自独立的永久连接。例如,如果有 20 个不同的子进程运行某脚本建立了永久的 SQL 服务器永久连接,那么实际上向该 SQL 服务器建立了 20 个不同的永久连接,每个进程占有一个。
注意,如果永久连接的子进程数目超过了设定的数据库连接数限制,系统将会产生一些缺陷。如果数据库的同时连接数限制为 16,而在繁忙会话的情况下,有 17 个线程试图连接,那么有一个线程将无法连接。如果这个时候,在脚本中出现了使得连接无法关闭的错误(例如无限循环),则该数据库的 16 个连接将迅速地受到影响。请查阅使用的数据库的文档,以获取关于如何处理已放弃的及闲置的连接的方法。 警告
在使用永久连接时还有一些特别的问题需要注意。例如在永久连接中使用数据表锁时,如果脚本不管什么原因无法释放该数据表锁,其随后使用相同连接的脚本将会被永久的阻塞,使得需要重新启动 httpd 服务或者数据库服务。另外,在使用事务处理时,如果脚本在事务阻塞产生前结束,则该阻塞也会影响到使用相同连接的下一个脚本。不管在什么情况下,都可以通过使用 register_shutdown_function() 函数来注册一个简单的清理函数来打开数据表锁,或者回滚事务。或者更好的处理方法,是不在使用数据表锁或者事务处理的脚本中使用永久连接,这可以从根本上解决这个问题(当然还可以在其它地方使用永久连接)。
步骤如下: 1.停止mysql服务(以管理员身份,在cmd命令行下运行)
net stop mysql
2.使用 mysqld –skip-grant-tables 命令启动mysql数据库
>D:\>net stop mysql
MySQL 服务正在停止.
MySQL 服务已成功停止。
D:\>mysqld --skip-grant-tables
3.新开一个cmd窗口,进行如下操作
D:\>mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.26-rc-community MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> update mysql.user set password=password('root') where user='root';
Query OK, 1 row affected (0.02 sec)
Rows matched: 2 Changed: 1 Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
4.打开任务管理器,停止mysql,mysqld进程,使用net start mysql启动mysqld服务,就可以使用root用户 root密码进入数据库了。
mysql -u root -p root
linux下解决办法和win下差不多,都是先开启一个没有权限验证的mysql,修改密码后直接重启mysql即可!
# 停用mysql
service mysqld stop
--------------------------------
# 使用无权限验证启动mysql
mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
# 如果启动失败可以采用修改mysql配置文件的方法
vim /etc/my.ini
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# ADD
skip-grant-tables
# 重启mysql
service mysql restart
--------------------------------
# 修改密码操作同上
# 重启mysql
service mysqld restart
以下是常见的mysql密码,修改的时候就不用使用password()再生成了。
SELECT PASSWORD('123456'); - *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
SELECT PASSWORD('mysql'); - *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA
SELECT PASSWORD('admin'); - *4ACFE3202A5FF5CF467898FC58AAB1D615029441
SELECT PASSWORD('root'); - *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
SELECT PASSWORD('toor'); - *9CFBBC772F3F6C106020035386DA5BBBF1249A11
SELECT PASSWORD('new-password'); - *4A82FDF1D80BA7470BA2E17FEEFD5A53D5D3B762
SELECT PASSWORD('kangle'); - *39534390859F20B4F7591340666D1B1FF1DC0F30
SELECT PASSWORD('asdqwe'); - *7E1FF641317801DCCB60031184404B45E8A84BCC
2015年1月19日更新:
增加linux解决方法
补充常见密码